Понедельник, 10 Декабря 2018, 09:09

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как проверить массив и текст в одно условие (можно ли упростить мою проверку?)
Как проверить массив и текст в одно условие
alexsilentДата: Четверг, 11 Октября 2018, 14:59 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Чтобы проверить, массив, я обычно ставлю два условия:
Код
if (MyArray && MyArray.length > 0)

проверяю инициирован ли массив вообще и потом есть ли у него яйчейки

А можно как -то сделать чтобы эти условия сократились, чтобы можно было проверять массивы в одну фразу?


Меня парит, что возможно есть более адекватный способ проверки в одно слово, и мой код не достаточно оптимизирован



****************
Тоже самое и с текстом, иногда не понимаешь когда String имеет свойство null, а когда "", поэтому приходится делать две проверки для этого, вместо одной
Код
if (MyString && MyString != "")

проверяю пустой ли текст null или пустой текст "" , по каким-то странным причинам это два разных условия, можно ли упростить мою проверку?


мои арты и страница на Девиантарте
моя игра в духе Fallout
моя леталка


Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 15:14
DivESДата: Четверг, 11 Октября 2018, 15:31 | Сообщение # 2
Blender 2.49b user
Сейчас нет на сайте
alexsilent, если уж так сильно хочется, то можно написать функцию, которой бы передавался массив и которая бы возвращала истину, если массив инициализирован и не пуст и ложь - в ином случае. И тогда оставалось бы просто каждый раз вызывать эту функцию :)

Добавлено (11 Октября 2018, 15:46)
---------------------------------------------

Цитата alexsilent ()
проверяю пустой ли текст null или пустой текст "" , по каким-то странным причинам это два разных условия

Когда null, речь идёт о пустом текстовом объекте. Когда "" - о пустой строке внутри непустого текстового объекта. Ну это если попытаться объяснить простыми словами :D
alexsilentДата: Четверг, 11 Октября 2018, 15:59 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Цитата DivES ()
Когда null, речь идёт о пустом текстовом объекте. Когда "" - о пустой строке внутри непустого текстового объекта. Ну это если попытаться объяснить простыми словами

Это я понимаю, просто имел ввиду, что не понятно когда текстовой объект инициирован, а когда нет, поэтому на всякий случай ставлю всегда две проверки, и это немного утомляет


мои арты и страница на Девиантарте
моя игра в духе Fallout
моя леталка
DivESДата: Четверг, 11 Октября 2018, 15:59 | Сообщение # 4
Blender 2.49b user
Сейчас нет на сайте
И я уже успел усомниться в своём высказывании. У меня "string==NULL" вообще отказывается работать, где string - объект класса String.
alexsilentДата: Четверг, 11 Октября 2018, 16:14 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Вообще вина в этом вся компилятора...

1) было бы удобнее, чтобы на строку
Код
if (MyArray.length > 0) {}

не выдавалась бы ошибка, если массив MyArray ещё не инициирован,
ведь по логике раз объект не инициирован , то и length всё равно равен нулю, таким образом убили бы двух зайцев,
просто бы молча бы согласился с утверждением , что length равен нулю

2) тоже самое и с кодом String
Код
if (MyString != "") {}

не выдавалась бы ошибка, если MyString равен null, по логике всё равно там пусто, ну и согласился бы компилятор с этим условием, а не ругался бы...


мои арты и страница на Девиантарте
моя игра в духе Fallout
моя леталка


Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 16:21
seamanДата: Четверг, 11 Октября 2018, 16:28 | Сообщение # 6
старожил
Сейчас нет на сайте
String.IsNullOrEmpty
?. и ?[]: операторы с условием NULL


Сообщение отредактировал seaman - Четверг, 11 Октября 2018, 16:32
alexsilentДата: Четверг, 11 Октября 2018, 16:31 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Цитата seaman ()
[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


мои арты и страница на Девиантарте
моя игра в духе Fallout
моя леталка


Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 17:07
PsychoДата: Четверг, 11 Октября 2018, 17:23 | Сообщение # 8
Психоламер
Сейчас нет на сайте
Цитата alexsilent ()
ведь по логике раз объект не инициирован , то и length всё равно равен нулю

Нет, как раз-таки по логике если объект не "инициирован", то поля "lenght" в нем не существует (как и какой-либо другой переменной или функции). Честно говоря, я вообще не понимаю логику этой двойной проверки - если Вам нужно просто пустое поле, то создаете объект через var text:String = "", а затем уже можете проверять есть там символы или нет через "if(text.lenght == 0)".

И еще вопрос оффтопом:
Почему в Вашем коде имя класса написано с маленькой буквы, а вот имя функции наоборот с большой?


Сообщение отредактировал Psycho - Четверг, 11 Октября 2018, 17:26
alexsilentДата: Четверг, 11 Октября 2018, 17:36 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
Цитата Psycho ()
Почему в Вашем коде имя класса написано с маленькой буквы, а вот имя функции наоборот с большой?


1) Это про "string" в C# коде? я забыл String пишется с маленькой или с большой в C# коде... Я быстро писал, если б компилятор поругался, то исправил бы, но мне хватило того, что всё равно не поддерживается особенность ".?"

2) Или это про "Manager.it.PoseNum"?
у меня it это глобальная переменная static it - которая обращается к всему скрипту (классу? наверное это так называется в C#) в котором сейчас находится, для удобства быстрого доступа, правда код не на C#, а Яваскрпите пишу, а то я пока не особо привык:

Код
static var it : MyThatScript;
function Init() {
  it = this; // один раз инициировать, и потом можно всегда обращаться к этому скрипту
// даже если этот объект со скриптом вообще не в сцене и не создан, а находится в префабах
}


,


мои арты и страница на Девиантарте
моя игра в духе Fallout
моя леталка


Сообщение отредактировал alexsilent - Четверг, 11 Октября 2018, 18:26
PsychoДата: Четверг, 11 Октября 2018, 17:45 | Сообщение # 10
Психоламер
Сейчас нет на сайте
Нет, я вот про это:
Цитата alexsilent ()
public class testCsh : MonoBehaviour

Цитата alexsilent ()
void Start ()


Для современных компиляторов это значения не имеет, но вообще принято название класса, интерфейса или объекта писать с большой буквы, а вот названия переменных и функций - с маленькой. Но это так, оффтоп.

Цитата alexsilent ()
не поддерживается особенность ".?"

Не обольщайтесь, это по сути та же проверка "if(string == null)", только записанная короче. Оптимизированнее код от нее не станет.


Сообщение отредактировал Psycho - Четверг, 11 Октября 2018, 17:47
alexsilentДата: Четверг, 11 Октября 2018, 18:04 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
Цитата Psycho ()
Нет, я вот про это:
Цитата alexsilent ()
public class testCsh : MonoBehaviour


А это я просто быстро писал, хотел скорее затестить, обычно я пишу с большой буквы названия всех скриптов (классов),
а тут не заморачивался.

Добавлено (11 Октября 2018, 18:05)
---------------------------------------------

Цитата Psycho ()
Цитата alexsilent ()
не поддерживается особенность ".?"

Не обольщайтесь, это по сути та же проверка "if(string == null)", только записанная короче. Оптимизированнее код от нее не станет.


Тогда не много потеряно, придётся вручную писать, спасибо за разъяснение!


мои арты и страница на Девиантарте
моя игра в духе Fallout
моя леталка
seamanДата: Четверг, 11 Октября 2018, 20:40 | Сообщение # 12
старожил
Сейчас нет на сайте
> А компилятор извиняется, что не поддерживает такую особенность
Переключись на .NET 4 в Edit => Project Settings => Player

Ну да - это только синтаксический сахар. Оптимальней код не станет, только короче запись.


Сообщение отредактировал seaman - Четверг, 11 Октября 2018, 20:42
drcrackДата: Четверг, 11 Октября 2018, 21:52 | Сообщение # 13
почти ветеран
Сейчас нет на сайте
А мне вот непонятно для чего вообще нужна проверка в таком виде
Есть нужный массив оказался null надо выбрасывать исключение или как минимум выходить из метода, возвращая какой-то индикатор ошибки, делая запись в лог и т.д.
Странная архитектура у тса)
zhuravelsvДата: Четверг, 11 Октября 2018, 22:16 | Сообщение # 14
почетный гость
Сейчас нет на сайте
Цитата seaman ()
Ну да - это только синтаксический сахар. Оптимальней код не станет, только короче запись.

ну вообще такие конструкции очень упрощают жизнь (.? if(obj is Type newVar) switch(source) {case source Type newVar:} и т.д.), очень раздражало остутствие в юнити С# 6+

Добавлено (11 Октября 2018, 22:21)
---------------------------------------------

Цитата Psycho ()
вот названия переменных и функций - с маленькой

это не совсем правда, в C# же паскаль кейс, все функции и паблик/протектед/интернал штуки должны быть в ТакомВотВиде, приватные в "_таком" или "м_таком" (вместо м какой-то символ пишут, не знаю какой, не пишу так), а локальные вот как раз и должны быть с маленькойБуквыВсегда, а то что юнити написали в разрез этому стандарту это уже у них проблема :'(
drcrackДата: Четверг, 11 Октября 2018, 23:09 | Сообщение # 15
почти ветеран
Сейчас нет на сайте
Цитата
приватные в "_таком" или "м_таком"

https://docs.microsoft.com/en-us....entions
General Naming Conventions:
Цитата
X DO NOT use underscores, hyphens, or any other nonalphanumeric characters.
X DO NOT use Hungarian notation.
pixeyeДата: Четверг, 11 Октября 2018, 23:54 | Сообщение # 16
Red Winter Software
Сейчас на сайте
Цитата zhuravelsv ()
"м_таком"


я когда такое вижу расстраиваюсь, читабельность имхо падает.


Battlecruiser - одна из моих игр
ACTORS - мой фреймворк на Unity3d



Сообщение отредактировал pixeye - Пятница, 12 Октября 2018, 00:21
zhuravelsvДата: Суббота, 13 Октября 2018, 15:19 | Сообщение # 17
почетный гость
Сейчас нет на сайте
Цитата pixeye ()
я когда такое вижу расстраиваюсь, читабельность имхо падает.

согласен, тоже не люблю это
Цитата 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
zitДата: Воскресенье, 14 Октября 2018, 19:46 | Сообщение # 18
был не раз
Сейчас нет на сайте
Цитата alexsilent ()
if (MyArray && MyArray.length > 0)

Рекомендую наоборот делать:
Код
void Update() {
if (MyArray.Length==0) return;
if (IgnoreUpdates) return;
if (CantWorkBecauseSunIsGoDown()) return;
// do something
}

Тогда не нужно рабочий код оборачивать в скобочки, особенно если проверки многоступенчатые.
drcrackДата: Понедельник, 15 Октября 2018, 00:17 | Сообщение # 19
почти ветеран
Сейчас нет на сайте
^ вот это кстати тоже верно, чем меньше вложенность, тем проще код для понимания, рефакторинга и отладки
если какой-то метод не получается написать таким способом, возможно, пора задуматься о том чтобы разбить его на пару методов попроще


Сообщение отредактировал drcrack - Понедельник, 15 Октября 2018, 00:17
ArtemSДата: Понедельник, 15 Октября 2018, 11:55 | Сообщение # 20
почетный гость
Сейчас нет на сайте
alexsilent, если не ошибаюсь то можно сразу делать проверку на длинну массива и формат строки, в противном случае их просто не может не быть
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Как проверить массив и текст в одно условие (можно ли упростить мою проверку?)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2018 Рейтинг