Скрытые возможности C #? [закрыто]

Object.keys () Метод Object.keys () возвращает массив собственных перечислимых свойств данного объекта в том же порядке, что и для цикла for ... in (разница заключается в том, что for-in loop также перечисляет свойства в цепочке прототипов).

var arr1 = Object.keys(obj);

Object.values ​​() Метод Object.values ​​() возвращает массив собственных значений перечислимого свойства данного объекта в том же порядке, что и что обеспечивается циклом for for ... in (разница заключается в том, что цикл for-in также перечисляет свойства в цепочке прототипов).

var arr2 = Object.values(obj);

Для получения дополнительной информации см. здесь

1476
задан 56 revs, 31 users 10% 25 September 2017 в 20:53
поделиться

295 ответов

Статические конструкторы.

Экземпляры:

public class Example
{
    static Example()
    {
        // Code to execute during type initialization
    }

    public Example()
    {
        // Code to execute during object initialization
    }
}

Статические классы:

public static class Example
{
    static Example()
    {
        // Code to execute during type initialization
    }
}

MSDN говорит :

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

, Например:

public class MyWebService
{
    public static DateTime StartTime;

    static MyWebService()
    {
        MyWebService.StartTime = DateTime.Now;
    }

    public TimeSpan Uptime
    {
        get { return DateTime.Now - MyWebService.StartTime; }
    }
}

, Но, Вы, возможно, также столь же легко сделали:

public class MyWebService
{
    public static DateTime StartTime = DateTime.Now;

    public TimeSpan Uptime
    {
        get { return DateTime.Now - MyWebService.StartTime; }
    }
}

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

MSDN предлагает полезные примечания по статическим конструкторам:

  • А статический конструктор не берет модификаторы доступа или имеет параметры.

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

  • А статического конструктора нельзя вызвать непосредственно.

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

  • А типичное использование статических конструкторов состоит в том, когда класс использует файл журнала, и конструктор используется для записи
    записи в этот файл.

  • Статические конструкторы также полезны при создании классов обертки для [1 112]
    неуправляемый код, когда конструктор
    может назвать метод LoadLibrary.

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

самое важное примечание - то, что, если ошибка происходит в статическом конструкторе, TypeIntializationException, брошен, и Вы не можете выполнить развертку к незаконной строке кода. Вместо этого необходимо исследовать TypeInitializationException InnerException участник, который является определенной причиной.

42
ответ дан 5 revs, 2 users 93% 25 September 2017 в 20:53
поделиться

Не забывайте [приблизительно 112] goto.

61
ответ дан 2 revs, 2 users 77% 25 September 2017 в 20:53
поделиться

Я не мог видеть этот взгляд выше - тот, что я не понял, что Вы могли сделать, до недавнего времени должен вызвать одного конструктора от другого:

class Example
{
    public Example(int value1)
        : this(value1, "Default Value")
    {
    }

    public Example(int value1, string value2)
    {
        m_Value1 = value1;
        m_value2 = value2;
    }

    int m_Value1;
    string m_value2;
}
55
ответ дан 3 revs, 2 users 97% 25 September 2017 в 20:53
поделиться

Несколько скрытых функций я столкнулся:

  • stackalloc, который позволяет Вам выделить массивы на стеке
  • Анонимные методы без явного списка параметров, которые неявно конвертируемы к любому типу делегата с non-out/ref параметрами (очень удобный для событий, как отмечено в более раннем комментарии)
  • , Много людей не знает о том, что действительно события (добавить/удалить пара методов, как получают/устанавливают для свойств); подобные полю события в C# действительно объявляют и переменную и событие
  • == и !=, операторы могут быть перегружены для возврата типов кроме bool. Странный, но верный.
  • перевод выражения запроса в C# 3 "действительно прост" до некоторой степени - что означает, что можно заставить его делать [приблизительно 114] очень нечетные вещи .
  • типы Nullable имеют специальное поведение упаковки: нулевое значение упаковывается к нулевой ссылке, и можно распаковать от пустого указателя до nullable типа также.
48
ответ дан Jon Skeet 25 September 2017 в 20:53
поделиться

Foreach использует Утку, Вводящую

Перефразирование или бесстыдно кража от блог Krzysztof Cwalinas на этом. Более интересные мелочи, чем что-нибудь.

Для Вашего объекта поддерживать foreach, Вы не делаете , должны реализовать IEnumerable. Т.е. это не ограничение, и оно не проверяется компилятором. То, что проверяется, - то, что

  • Ваш объект обеспечивает открытый метод GetEnumerator , который
    • не берет параметров
    • , возвращают тип, который имеет двух участников
      1. без параметров метод MoveNext что возвраты булевская переменная
      2. свойство Current с методом get что возвраты Объект

, Например,

class Foo
{
    public Bar GetEnumerator() { return new Bar(); }

    public struct Bar
    {
        public bool MoveNext()
        {
            return false;
        }

        public object Current
        {
            get { return null; }
        }
    }
}

// the following complies just fine:
Foo f = new Foo();
foreach (object o in f)
{
    Console.WriteLine("Krzysztof Cwalina's da man!");
}
44
ответ дан 2 revs, 2 users 99% 25 September 2017 в 20:53
поделиться

Не скрытый, но я думаю, что много разработчиков не использует свойства HasValue и Value на nullable типах.

        int? x = null;
        int y;
        if (x.HasValue)
            y = x.Value;
34
ответ дан Rismo 25 September 2017 в 20:53
поделиться

Вложение Используя Операторы

Обычно мы делаем это как это:

StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter()) {
    using (IndentedTextWriter itw = new IndentedTextWriter(sw)) {
        ... 
    }
}

, Но мы можем сделать это этот путь:

StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter())
using (IndentedTextWriter itw = new IndentedTextWriter(sw)) {
    ... 
}
28
ответ дан jfs 25 September 2017 в 20:53
поделиться

Мне нравится ключевое слово , продолжаются .

, Если Вы поражаете условие в цикле и не хотите делать что-нибудь кроме усовершенствования, цикл просто всовывает, "продолжаются";.

, Например:

foreach(object o in ACollection)
{
  if(NotInterested)
     continue;
}
30
ответ дан 2 revs, 2 users 87% 25 September 2017 в 20:53
поделиться

Мой фаворит

global::

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

Пример:

global::System.Collections.Generic.List<global::System.String> myList =
    new global::System.Collections.Generic.List<global::System.String>();
33
ответ дан 2 revs, 2 users 62% 25 September 2017 в 20:53
поделиться

Полный доступ к стеку вызовов:

public static void Main()
{
  StackTrace stackTrace = new StackTrace();           // get call stack
  StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

  // write call stack method names
  foreach (StackFrame stackFrame in stackFrames)
  {
    Console.WriteLine(stackFrame.GetMethod().Name);   // write method name
  }
}

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

28
ответ дан IgorM 25 September 2017 в 20:53
поделиться

Я забрал этого при использовании ReSharper:

Неявное Преобразование Группы Метода

//If given this:
var myStrings = new List<string>(){"abc","def","xyz"};
//Then this:
myStrings.ForEach(s => Console.WriteLine(s));
//Is equivalent to this:
myStrings.ForEach(Console.WriteLine);

См." Неявное Преобразование Группы Метода в C#" для больше.

70
ответ дан 3 revs, 3 users 78%t4 25 September 2017 в 20:53
поделиться

атрибут InternalsVisibleTo является тем, который не настолько известен, но может войти increadibly удобный при определенных обстоятельствах. Это в основном позволяет другому блоку быть в состоянии получить доступ к "внутренним" элементам блока определения.

73
ответ дан 2 revs, 2 users 67% 25 September 2017 в 20:53
поделиться

Атрибуты в целом, но больше всего DebuggerDisplay. Сохраняет Вас годы.

226
ответ дан 2 revs, 2 users 67% 25 September 2017 в 20:53
поделиться

Пара других атрибутов от Система. Диагностика пространство имен довольно полезна.

DebuggerBrowsable позволит Вам скрыть переменные от окна отладки (мы используем его для всех частных переменных поддержки представленных свойств). Наряду с этим, DebuggerStepThrough заставляет отладчик переступить через тот код, очень полезный для немых свойств (вероятно, должен быть преобразован в автосвойства, если можно взять зависимость к компилятору C# 3.0). Как пример

[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string nickName;
public string NickName    {
    [DebuggerStepThrough]
    get { return nickName; }
    [DebuggerStepThrough]
    set { this.nickName = value; }
}
40
ответ дан bdukes 25 September 2017 в 20:53
поделиться

говорит компилятору игнорировать любые символы ESC в строке.

Просто хотел разъяснить этого..., это не говорит ему игнорировать символы ESC, это на самом деле говорит компилятору интерпретировать строку как литерал.

, Если Вы имеете

string s = @"cat
             dog
             fish"

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

cat
             dog
             fish
221
ответ дан 4 revs, 4 users 77% 25 September 2017 в 20:53
поделиться

Ключевое слово 'по умолчанию' в универсальных типах:

T t = default(T);

результаты в 'пустом указателе', если T является ссылочным типом, и 0, если это - интервал, ложь, если это - булевская переменная и так далее.

255
ответ дан Eric Minkes 25 September 2017 в 20:53
поделиться

Я склонен находить, что большинство разработчиков C# не знает о 'nullable' типах. В основном, примитивы, которые могут иметь нулевое значение.

double? num1 = null; 
double num2 = num1 ?? -100;

Набор nullable двойное, num1, к пустому указателю, затем установил двойного постоянного клиента, num2, к num1 или -100 , если num1 был пустым.

http://msdn.microsoft.com/en-us/library/1t3y8s4s (По сравнению с 80) .aspx

еще одна вещь о типе Nullable:

DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();

это - возвращаемая строка. Пустой. Проверьте этот ссылка для получения дополнительной информации

198
ответ дан 4 revs, 3 users 62% 25 September 2017 в 20:53
поделиться

Все остальное, плюс

1) неявные дженерики (почему только на методах а не на классах?)

void GenericMethod<T>( T input ) { ... }

//Infer type, so
GenericMethod<int>(23); //You don't need the <>.
GenericMethod(23);      //Is enough.

2) простые лямбды с одним параметром:

x => x.ToString() //simplify so many calls

3) анонимные типы и инициализаторы:

//Duck-typed: works with any .Add method.
var colours = new Dictionary<string, string> {
    { "red", "#ff0000" },
    { "green", "#00ff00" },
    { "blue", "#0000ff" }
};

int[] arrayOfInt = { 1, 2, 3, 4, 5 };
<час>

Другой:

4) свойства Auto могут иметь различные объемы:

public int MyId { get; private set; }
<час>

Благодарен за то, что @pzycoman напоминает мне:

5) псевдонимы Пространства имен (не, что Вам, вероятно, будет нужно это конкретное различие):

using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;

web::Control aWebControl = new web::Control();
win::Control aFormControl = new win::Control();
305
ответ дан 8 revs, 4 users 88% 25 September 2017 в 20:53
поделиться

Способность иметь перечислимые типы имеет значения кроме интервала (значение по умолчанию)

public enum MyEnum : long
{
    Val1 = 1,
    Val2 = 2
}

кроме того, то, что можно присвоить любое числовое значение тому перечислению:

MyEnum e = (MyEnum)123;
36
ответ дан Luke Foust 25 September 2017 в 20:53
поделиться

Использование @ для имен переменных, которые являются ключевыми словами.

var @object = new object();
var @string = "";
var @if = IpsoFacto(); 
176
ответ дан Mark Cidade 25 September 2017 в 20:53
поделиться

Вот некоторые интересные скрытые возможности C # в форме недокументированных ключевых слов C #:

__makeref

__reftype

__refvalue

__arglist

Это недокументированные ключевые слова C # (даже Visual Studio распознает их!), Которые были добавлены для более эффективной упаковки. / распаковка до дженериков. Они работают в координации со структурой System.TypedReference.

Существует также __arglist, который используется для списков параметров переменной длины.

Одна вещь, о которой мало кто знает, это System.WeakReference - очень полезный класс, который отслеживает объект, но все же позволяет сборщику мусора собирать его.

Наиболее полезной «скрытой» функцией будет ключевое слово yield return. Это на самом деле не скрыто, но многие люди не знают об этом. LINQ построен на этом; он позволяет выполнять запросы с задержкой, генерируя конечный автомат. Раймонд Чен недавно написал о внутренних, мельчайших деталях .

193
ответ дан 4 revs, 3 users 78% 25 September 2017 в 20:53
поделиться

Многие люди не понимают, что они могут сравнивать строки, используя: OrdinalIgnoreCase вместо необходимости выполнять someString.ToUpper (). Это устраняет дополнительные накладные расходы на выделение строк.

if( myString.ToUpper() == theirString.ToUpper() ){ ... }

становится

if( myString.Equals( theirString, StringComparison.OrdinalIgnoreCase ) ){ ... }
94
ответ дан 2 revs, 2 users 92% 25 September 2017 в 20:53
поделиться

Возможно, не усовершенствованная техника, но один я вижу все время, что это сводит меня с ума:

if (x == 1)
{
   x = 2;
}
else
{
   x = 3;
}

может быть сжат к:

x = (x==1) ? 2 : 3;
98
ответ дан JasonS 25 September 2017 в 20:53
поделиться

При попытке использовать фигурные скобки в Строке. Выражение формата...

int foo = 3;
string bar = "blind mice";
String.Format("{{I am in brackets!}} {0} {1}", foo, bar);
//Outputs "{I am in brackets!} 3 blind mice"
111
ответ дан 3 revs, 2 users 85% 25 September 2017 в 20:53
поделиться

Просто изученные, анонимные типы могут вывести имена свойства из имени переменной:

string hello = "world";
var o = new { hello };
Console.WriteLine(o.hello);
80
ответ дан Cristian Libardo 25 September 2017 в 20:53
поделиться

Я просто узнал об этом сегодня - и я работал с C# в течение 5 лет!

Это спецификатор псевдонима пространства имен :

extern alias YourAliasHere;

можно использовать его для загрузки нескольких версий того же типа. Это может быть полезно в обслуживании или обновить сценарии, где у Вас есть обновленная версия Вашего типа, который не будет работать в некотором старом коде, но необходимо обновить его до новой версии. Удар на спецификаторе псевдонима пространства имен , и компилятор позволит Вам иметь оба типа в своем коде.

36
ответ дан 2 revs 25 September 2017 в 20:53
поделиться
Environment.NewLine

для системно-независимых новых строк.

115
ответ дан 2 revs, 2 users 67% 25 September 2017 в 20:53
поделиться

Стараются не проверять на пустые обработчики событий

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

public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!

Позволяют Вам сделать это

public void DoSomething()
{
    Click(this, "foo");
}

Вместо этого

public void DoSomething()
{
    // Unnecessary!
    MyClickHandler click = Click;
    if (click != null) // Unnecessary! 
    {
        click(this, "foo");
    }
}

, также посмотрите этот связанное обсуждение и этот сообщение в блоге Eric Lippert по этой теме (и возможные оборотные стороны).

314
ответ дан 6 revs, 4 users 79% 25 September 2017 в 20:53
поделиться

Возврат анонимных типов из метода и доступ к членам без отражения.

// Useful? probably not.
private void foo()
{
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) });
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges);
}

object GetUserTuple()
{
    return new { Name = "dp", Badges = 5 };
}    

// Using the magic of Type Inference...
static T AnonCast<T>(object obj, T t)
{
   return (T) obj;
}
153
ответ дан 3 revs, 3 users 95% 25 September 2017 в 20:53
поделиться

Не уверенный, почему любой когда-либо хотел бы использовать Nullable< bool> все же.:-)

Правда, Ложь, FileNotFound?

131
ответ дан 2 revs, 2 users 91% 25 September 2017 в 20:53
поделиться