Какое языковое решение в C # вас раздражает? [закрыто]

7
задан Adam Lear 19 December 2011 в 18:44
поделиться

13 ответов

При создании строки ссылочный тип кажется совершенно разумным мне.

Это - позор, что нельзя объявить, что тип переменной/параметра/возврата является не допускающим NULL-значения хотя - например.

// Never returns null
public string! Foo()
{
}

Контракты кода в.NET 4.0 помогут с этим, я верю - но немного поздно для создания этого распространяющимся.

Только что я записал запись в блоге на ошибках C#. Суммировать то сообщение:

C# 1:

  • Отсутствие отдельного доступа метода считывания/метода set для свойств.
  • Отсутствие дженериков. Жизнь была бы намного более сладкой с дженериками от запуска.
  • Классы, не изолируемые по умолчанию.
  • Перечисления, просто называемые числами.
  • "\x" управляющая последовательность символов.
  • Различные вещи об операторе переключения :)
  • Некоторые нечетные правила разрешения перегрузки
  • Ключевое слово "блокировки", вместо того, чтобы "использовать" с маркером блокировки.

C# 2:

  • Отсутствие частичных методов (прибыл в C# 3),
  • Отсутствие универсального различия (прибывающий в C# 4)
  • System.Nullable класс (нет Nullable<T> - это прекрасно!)
  • InternalsVisibleTo, требующий целого открытого ключа для решительно блоков со знаком вместо маркера открытых ключей.

C# 3:

  • Отсутствие поддержки неизменности - много изменений улучшило возможности для видоизменения типов (автоматические свойства, объект и инициализаторы набора), но ни один из них действительно не работает на изменяемые типы
  • Дополнительное исследование метода
21
ответ дан 6 December 2019 в 04:45
поделиться

Тестирование строк для Пустого или Пустого лучше всего сделано с помощью:

if (string.IsNullOrEmpty(testString))
{
}
28
ответ дан 6 December 2019 в 04:45
поделиться

и касательно параметров

5
ответ дан 6 December 2019 в 04:45
поделиться

Вероятно, самая большая явная дыра в C#, для меня, перечислений.

Перечисления Java являются безопасными с точки зрения типов классами, которым можно дать поведение, может реализовать интерфейсы и так далее.

Перечисления C#/.Net просто прославлены, ints со всеми проблемными константами интервала имели возвращение к C и C++.

7
ответ дан 6 December 2019 в 04:45
поделиться

Подробно останавливаясь на ответе Mitch.

Это - на самом деле решение CLR, не C# один. C# не имеет никакого контроля над деталями реализации Системы BCL. Строковый класс.

Истинный C# мог иметь специальную строку в корпусе в компиляторе и сказал, что мы сделаем специальные пустые проверки, но это имело бы, по моему скромному мнению, плохое решение. Строка. IsNullOrEmpty является приемлемым компромиссом.

1
ответ дан 6 December 2019 в 04:45
поделиться

Путем я должен реализовать свойства от интерфейса в c# 3.0 даже при том, что они - точно то же как интерфейс, когда я не изменяю поведение по умолчанию автоматических свойств.

например.

public interface MyInterface
{
   int MyProperty { get; set;}
}

public class MyClass : MyInterface
{
   public int MyProperty { get; set; }
}

public class MyClass2 : MyInterface
{
   public int MyProperty { get; set; }
}

public class MyClass3 : MyInterface
{
   public int MyProperty { get; set; }
}

Править: Обратиться к некоторым комментариям к этому. Я не изменяю поведения по умолчанию своего метода считывания. Я понимаю, что различие между классом и интерфейсом слова благодарности, моя точка - то, что моя маркировка его с интерфейсом, у меня не придется быть этого свойства в каждом классе с реализацией, если я не хочу изменить поведение по умолчанию метода считывания или метода set. Предположите, что 500 классов реализуют этот интерфейс?

Также отсутствие Mixins..

0
ответ дан 6 December 2019 в 04:45
поделиться

Проверенные исключения были бы хорошими. Я знаю, что многие люди ненавидят их с Java, но я думаю, что это всегда принудительные проверки работоспособности, особенно при вводе-выводе. Мне нравится большинство вещей, которые C # изменил и / или добавил по сравнению с Java, но мне бы очень хотелось, чтобы они приняли проверенные исключения. Сейчас уже слишком поздно (среда .NET, изменяемая так, чтобы они ломали практически все программы), но я думаю, было бы лучше иметь их.

1
ответ дан 6 December 2019 в 04:45
поделиться

Применение разрыва в непустом регистре.

Детальность перечислений, особенно в операторах регистра. Если у меня есть switch (expr) и expr - это enum, меня не должны заставлять полностью квалифицировать каждое перечисление в каждом случае, если только нет конфликта имен.

1
ответ дан 6 December 2019 в 04:45
поделиться

Я хотел бы видеть объекты класса как объекты первого класса в языке.

Это позволит вам переопределить статические методы и объявить их в интерфейсах.

0
ответ дан 6 December 2019 в 04:45
поделиться

Not allowing co/contra-variance or access rights changes when overriding base class or implementing interface methods:

public class A
{
    protected virtual Stream method()
    {
        //...stuff...
    }
}

public class B : A
{
    // compiler borks...
    public override FileStream method()
    {
        //...more stuff...
    }
}
0
ответ дан 6 December 2019 в 04:45
поделиться

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

Почему:

Array.Sort(myArray);
String.IsNullOrEmpty(myString);

вместо:

myArray.Sort();
myString.IsNullOrEmpty

Я не говорю, что для этого нет веских причин, и это не имеет большого значения, но если JS может справиться с этим, почему может ' т C #? *

Также реализация переключателя . Я действительно думаю, что они должны были доверить нам провал.

* Кстати, я тоже скучаю по синтаксису закрытия JS.

0
ответ дан 6 December 2019 в 04:45
поделиться

Ненавижу набирать IEnumerable повсюду. Это так трудно читать. Я бы предпочел что-то вроде сокращенной записи, чтобы мой код был чище.

Это сообщение SO хорошо подводит итог.

0
ответ дан 6 December 2019 в 04:45
поделиться

Мне не нравятся IDisposable / Dispose и т. Д. Исходя из C ++, очень неприятно думать об управлении памятью в C #. Оператор using подходит, если одноразовый объект используется только в одной функции. Если его нужно передать, вам нужно вручную указать счетчик ссылок или сделать что-то еще, чтобы узнать, когда можно избавиться от объекта.

0
ответ дан 6 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: