NotAComputerScienceStudent Ответов: 3

Тернарные операторы в C#



Можно ли использовать только часть "?" Теренарных операторов вместо использования обоих ? и :

Эта ошибка продолжает приходить

Что я уже пробовал:

using System;

class Students
{
    private int ID;
    private string Name;
    private int PassMark = 35;

    public void SetId(int id)
    {
        if (id < 0)
        {
            throw new Exception("Your id cannot be less than '0'");
        }
        this.ID = id;
    }
    public int GetId()
    {
        return this.ID;
    }
    public void SetName(string name)
    {
        if (string.IsNullOrEmpty(Name) ? throw new Exception
            ("Your Name cannot be 'Null'")) //There is this error here that i cant solve

        this.Name = name;
    }
    public string GetName()
    {
        return string.IsNullOrEmpty(this.Name)? "No Name" : this.Name;
    }
    public int GetPassMark()
    {
        return this.PassMark;
    }
}

class Program
{
    public static void Main()
    {
        Students C1 = new Students();
        C1.SetId(100);
        C1.SetName("John");

        Console.WriteLine("Name = {0} && Id = {1} && PassMark = {2}", C1.GetName(), C1.GetId(), C1.GetPassMark());
    }
}

3 Ответов

Рейтинг:
20

Nelek

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

А вы пробовали

string.IsNullOrEmpty(Name) ? throw new Exception ("Your Name cannot be 'Null'"))  : this.Name = name;

или
if (string.IsNullOrEmpty(Name))
{
   throw new Exception ("Your Name cannot be 'Null'"));
}
else
{
   this.Name = name;
}

?

И используя только первый термин с "?"... Я бы не стал этого делать. Не уверен, что это вообще возможно, но по соображениям ясности я бы использовал "если" без "еще"


NotAComputerScienceStudent

Это? эта штука выглядела круче так что я просто хотел посмотреть возможно ли это

Nelek

Как говорится... лучший учитель-это собственные ошибки, не так ли?

Рейтинг:
1

#realJSOP

Нет, это невозможно. В "?" есть ":".

Кстати, это не обязательно, но это хорошая идея, чтобы охватить сравнение:

return (string.IsNullOrEmpty(this.Name))? "No Name" : this.Name;


а пуристы предложат вам охватить все высказывание целиком:

return ((string.IsNullOrEmpty(this.Name))? "No Name" : this.Name);


Рейтинг:
0

Eric Lynch

Как упоминает Джон Симмонс, это просто недопустимый C#. Вы должны следовать синтаксическим правилам языка. Вы не можете просто сделать их, как вы идете вперед :)

Тем не менее, если вы используете последнюю версию C#, я предполагаю, что вы, возможно, захотите сделать следующее:

Name = string.IsNullOrEmpty(name) ? throw new Exception("Your Name cannot be 'Null'") : name;


Недавний C# позволяет включать броски с тернарным оператором.

Кроме того, похоже, что вы новичок в C#. Шаблон GetXXX/SetXXX-это скорее Java-вещь. Вероятно, вам следует посмотреть, как работают свойства C#. Они формализуют этот паттерн в языке C#.

private string name = "No Name";

public string Name
{
   get => name;
   set => name = value ?? throw new ArgumentNullException("Name");
}


Затем вы можете просто получить доступ к собственности Name как будто это переменная в вашем коде. Обратите внимание, что приведенный выше код исключает только нулевые значения. Если вам также нужно исключить пустые значения, вам придется немного больше кодировать.

В то время как вышеизложенное остается правильным для нулевых значений, для пустых значений вы должны рассмотреть возможность выбрасывания ArgumentException Как правило, нецелесообразно просто бросать Exception Почти всегда существует более значимое/конкретное исключение. В том редком случае, когда его нет, вы должны создать свой собственный, исходя из Exception.