ЕСЛИ({Не инициирована поза} ИЛИ {Не инициирован массив ActsA} ИЛИ {В этом массиве нет яйчеек})
помимо того что фраза {В этом массиве нет яйчеек} проверяет второй раз существует ли массив (чтобы не вылететь с ошибкой, если массив ещё не инициирован, так она и ещё очень длинная и неудобная)
а хотелось бы чтобы была всего одна проверка, типа так:
Код
ЕСЛИ ({Не инициирована поза} ИЛИ {Не инициирован массив}) {...}
где в фразу "Не инициирован массив" - входит вообще вся проверка, что он инициирован и что там есть яйчейки
**************** Тоже самое и с текстом, иногда не понимаешь когда String имеет свойство null, а когда "", поэтому приходится делать две проверки для этого, вместо одной
Код
if (MyString && MyString != "")
проверяю пустой ли текст null или пустой текст "" , по каким-то странным причинам это два разных условия, можно ли упростить мою проверку?
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 15:14
alexsilent, если уж так сильно хочется, то можно написать функцию, которой бы передавался массив и которая бы возвращала истину, если массив инициализирован и не пуст и ложь - в ином случае. И тогда оставалось бы просто каждый раз вызывать эту функцию
Добавлено (11 Октября 2018, 15:46) ---------------------------------------------
Цитатаalexsilent ()
проверяю пустой ли текст null или пустой текст "" , по каким-то странным причинам это два разных условия
Когда null, речь идёт о пустом текстовом объекте. Когда "" - о пустой строке внутри непустого текстового объекта. Ну это если попытаться объяснить простыми словами
Когда null, речь идёт о пустом текстовом объекте. Когда "" - о пустой строке внутри непустого текстового объекта. Ну это если попытаться объяснить простыми словами
Это я понимаю, просто имел ввиду, что не понятно когда текстовой объект инициирован, а когда нет, поэтому на всякий случай ставлю всегда две проверки, и это немного утомляет
не выдавалась бы ошибка, если массив MyArray ещё не инициирован, ведь по логике раз объект не инициирован , то и length всё равно равен нулю, таким образом убили бы двух зайцев, просто бы молча бы согласился с утверждением , что length равен нулю
2) тоже самое и с кодом String
Код
if (MyString != "") {}
не выдавалась бы ошибка, если MyString равен null, по логике всё равно там пусто, ну и согласился бы компилятор с этим условием, а не ругался бы...
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 16:21
[url=https://docs.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/490acw3e(v%3Dvs.95)]String.IsNullOrEmpty[/url] ?. и ?[]: операторы с условием NULL
seaman, спасибо, крутая опция в C# есть, надо бы погуглить есть ли такое в Яваскрипте (ибо у меня всё ещё остались проекты на юнити на яваскрипте, а на шарп я пока только перехожу).
Добавлено (11 Октября 2018, 16:46) --------------------------------------------- Жаль, не хочет работать такой код на яваскрипте
Код
#pragma strict
function Start () { var text : String = null; if (text?.length == 0) { print("text is empty!"); } }
Добавлено (11 Октября 2018, 16:54) --------------------------------------------- оказывается такой код не работает даже в C# на юнити... (у меня версия 2018.1.8f)
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class testCsh : MonoBehaviour {
void Start () { string text = null; if (text?.length == 0) { print("text is empty!"); } } }
А компилятор извиняется, что не поддерживает такую особенность о_О
Код
Assets/4 SCRIPTS/testCsh.cs(9,11): error CS1644: Feature `null propagating operator' cannot be used because it is not part of the C# 4.0 language specification
Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 17:07
ведь по логике раз объект не инициирован , то и length всё равно равен нулю
Нет, как раз-таки по логике если объект не "инициирован", то поля "lenght" в нем не существует (как и какой-либо другой переменной или функции). Честно говоря, я вообще не понимаю логику этой двойной проверки - если Вам нужно просто пустое поле, то создаете объект через var text:String = "", а затем уже можете проверять есть там символы или нет через "if(text.lenght == 0)".
И еще вопрос оффтопом: Почему в Вашем коде имя класса написано с маленькой буквы, а вот имя функции наоборот с большой?
Сообщение отредактировал Psycho - Четверг, 11 Октября 2018, 17:26
Почему в Вашем коде имя класса написано с маленькой буквы, а вот имя функции наоборот с большой?
1) Это про "string" в C# коде? я забыл String пишется с маленькой или с большой в C# коде... Я быстро писал, если б компилятор поругался, то исправил бы, но мне хватило того, что всё равно не поддерживается особенность ".?"
2) Или это про "Manager.it.PoseNum"? у меня it это глобальная переменная static it - которая обращается к всему скрипту (классу? наверное это так называется в C#) в котором сейчас находится, для удобства быстрого доступа, правда код не на C#, а Яваскрпите пишу, а то я пока не особо привык:
Код
static var it : MyThatScript; function Init() { it = this; // один раз инициировать, и потом можно всегда обращаться к этому скрипту // даже если этот объект со скриптом вообще не в сцене и не создан, а находится в префабах }
*************** (it - с маленькой потому-что так меньше писать, не надо шифт жмякать в этот момент, я вообще ленивый и чем меньше действий делать, и чем меньше и короче фраза тем лучше для меня, а у функций и переменных с большой буквы, потому-что привык функции выделять и важные переменные, а it не важная переменная, она должна почти слиться с продолжением названия своего скрипта, чтоб не выделялась, да я знаю это очень странная философия) мне просто вообще хотелось бы обращаться к скрипту вот так
Код
Manager.MyVariable = 1; Manager.MyFunction();
но так можно обращаться только к статическим переменным и функциям, а статические функции накладывают такие ограничения как то что внутри статической функции нельзя добавлять локальные переменные, и я решил избавиться от статических функций, обращаясь всего один раз к классу
Для современных компиляторов это значения не имеет, но вообще принято название класса, интерфейса или объекта писать с большой буквы, а вот названия переменных и функций - с маленькой. Но это так, оффтоп.
Цитатаalexsilent ()
не поддерживается особенность ".?"
Не обольщайтесь, это по сути та же проверка "if(string == null)", только записанная короче. Оптимизированнее код от нее не станет.
Сообщение отредактировал Psycho - Четверг, 11 Октября 2018, 17:47
А мне вот непонятно для чего вообще нужна проверка в таком виде Есть нужный массив оказался null надо выбрасывать исключение или как минимум выходить из метода, возвращая какой-то индикатор ошибки, делая запись в лог и т.д. Странная архитектура у тса)
Ну да - это только синтаксический сахар. Оптимальней код не станет, только короче запись.
ну вообще такие конструкции очень упрощают жизнь (.? if(obj is Type newVar) switch(source) {case source Type newVar:} и т.д.), очень раздражало остутствие в юнити С# 6+
Добавлено (11 Октября 2018, 22:21) ---------------------------------------------
ЦитатаPsycho ()
вот названия переменных и функций - с маленькой
это не совсем правда, в C# же паскаль кейс, все функции и паблик/протектед/интернал штуки должны быть в ТакомВотВиде, приватные в "_таком" или "м_таком" (вместо м какой-то символ пишут, не знаю какой, не пишу так), а локальные вот как раз и должны быть с маленькойБуквыВсегда, а то что юнити написали в разрез этому стандарту это уже у них проблема
я когда такое вижу расстраиваюсь, читабельность имхо падает.
согласен, тоже не люблю это
Цитатаdrcrack ()
General Naming Conventions: X DO NOT use underscores, hyphens, or any other nonalphanumeric characters. X DO NOT use Hungarian notation.
Странно что у них написано именно "any other nonalphanumeric characters", так как это противоречит спецификации языка (ecma-334): "any other nonalphanumeric characters" так как там сказано " and the “@” character is allowed as a prefix to enable keywords to be used as identifiers", ну а вообще про подчёркивания сказано что использовать нельзя но допускается (я думал что так можно делать , как теперь жить, у меня везде у приватных переменных такие нейминги ) )
Сообщение отредактировал zhuravelsv - Суббота, 13 Октября 2018, 15:20
^ вот это кстати тоже верно, чем меньше вложенность, тем проще код для понимания, рефакторинга и отладки если какой-то метод не получается написать таким способом, возможно, пора задуматься о том чтобы разбить его на пару методов попроще
Сообщение отредактировал drcrack - Понедельник, 15 Октября 2018, 00:17
alexsilent, если не ошибаюсь то можно сразу делать проверку на длинну массива и формат строки, в противном случае их просто не может не быть хуяк, хуяк и в продакшн