Эквивалентный из определения типа в C#

Я думаю, что важно подчеркнуть, что в Java нет такой вещи, как «Инициализация двойного браслеза». Веб-сайт Oracle не имеет этого термина. В этом примере используются две функции: анонимный класс и блок инициализатора. Похоже, что старый блок инициализатора был забыт разработчиками и вызвал некоторую путаницу в этой теме. Цитирование из Oracle docs :

Блоки инициализатора для переменных экземпляра выглядят так же, как и статические блоки инициализатора, но без статического ключевого слова:

{
    // whatever code is needed for initialization goes here
}

308
задан bacar 23 June 2011 в 07:56
поделиться

5 ответов

Нет, нет никакого истинного эквивалента определения типа. Можно использовать директивы 'использования' в одном файле, например,

using CustomerList = System.Collections.Generic.List<Customer>;

, но это только повлияет на тот исходный файл. В C и C++, мой опыт состоит в том, что typedef обычно используется в.h файлах, которые включены широко - таким образом, сингл typedef может использоваться по целому проекту. Та способность не существует в C#, потому что нет никакого #include функциональность в C#, который позволил бы Вам включать эти using директивы из одного файла в другом.

, К счастью, пример Вы даете , делает , имеют фиксацию - неявное преобразование группы метода. Можно изменить строку подписки события на просто:

gcInt.MyEvent += gcInt_MyEvent;

:)

324
ответ дан Jon Skeet 23 November 2019 в 01:17
поделиться

Jon действительно дал хорошее решение, я не знал, что Вы могли сделать это!

Время от времени то, к чему я обратился, наследовалось классу и создало его конструкторов. Например,

public class FooList : List<Foo> { ... }

Не лучшее решение (если Ваш блок не привыкает другими людьми), но он работает.

36
ответ дан Edward Brey 23 November 2019 в 01:17
поделиться

Я думаю, что нет никакого определения типа. Вы могли только определить определенный тип делегата вместо универсального в GenericClass, т.е.

public delegate GenericHandler EventHandler<EventData>

Это сделает его короче. Но что относительно следующего предложения:

Visual Studio Использования. Таким образом, когда Вы ввели

gcInt.MyEvent += 

это уже, обеспечивает полную подпись обработчика событий от Intellisense. Нажмите TAB, и это там. Примите сгенерированное название обработчика или измените его, и затем нажмите TAB снова, чтобы автоматически сгенерировать тупик обработчика.

5
ответ дан OregonGhost 23 November 2019 в 01:17
поделиться

C# поддерживает некоторую наследованную ковариантность для делегатов событий, таким образом, метод как это:

void LowestCommonHander( object sender, EventArgs e ) { ... } 

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

gcInt.MyEvent += LowestCommonHander;

, можно даже использовать синтаксис лямбды, и intellisense будет все сделан для Вас:

gcInt.MyEvent += (sender, e) =>
{
    e. //you'll get correct intellisense here
};
6
ответ дан Keith 23 November 2019 в 01:17
поделиться

Поскольку незапечатанные классы просто наследовались от них:

public class Vector : List<int> { }

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

public abstract class Typedef<T, TDerived> where TDerived : Typedef<T, TDerived>, new()
{
    private T _value;

    public static implicit operator T(Typedef<T, TDerived> t)
    {
        return t == null ? default : t._value;
    }

    public static implicit operator Typedef<T, TDerived>(T t)
    {
        return t == null ? default : new TDerived { _value = t };
    }
}

// Usage examples

class CountryCode : Typedef<string, CountryCode> { }
class CurrencyCode : Typedef<string, CurrencyCode> { }
class Quantity : Typedef<int, Quantity> { }

void Main()
{
    var canadaCode = (CountryCode)"CA";
    var canadaCurrency = (CurrencyCode)"CAD";
    CountryCode cc = canadaCurrency;        // Compilation error
    Concole.WriteLine(canadaCode == "CA");  // true
    Concole.WriteLine(canadaCurrency);      // CAD

    var qty = (Quantity)123;
    Concole.WriteLine(qty);                 // 123
}
0
ответ дан 23 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

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