Скрытые возможности 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 ответов

Я должен признать, что я не уверен, работает ли это лучше или хуже, чем нормальный повторитель ASP.NET onItemDatabound код броска, но так или иначе вот мои 5 центов.

MyObject obj = e.Item.DataItem as MyObject;
if(obj != null)
{
  //Do work
}
2
ответ дан martinlund 25 September 2017 в 20:53
поделиться

Свойство PreviousPage:

"Система. Сеть. Представление UI.Page страницы, которая передала управление текущей странице".

Это очень полезно.

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

Вот ПОДСКАЗКА из как можно использовать #Region директиву для документирования кода.

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

Некоторые?? странность:)

Delegate target =
  (target0 = target as CallTargetWithContext0) ??
  (target1 = target as CallTargetWithContext1) ??
  (target2 = target as CallTargetWithContext2) ??
  (target3 = target as CallTargetWithContext3) ??
  (target4 = target as CallTargetWithContext4) ??
  (target5 = target as CallTargetWithContext5) ??
  ((Delegate)(targetN = target as CallTargetWithContextN));

Интересный отметить последний бросок, который необходим по некоторым причинам. Ошибка или дизайном?

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

Если сторонние расширения позволяются, то C5 и Microsoft CCR (см. это сообщение в блоге для краткого введения), должен - знают.

.Net's дополнений C5, несколько испытывающий недостаток в библиотеке наборов (не Набор???), и CCR делает параллельное программирование легче (я слышу, что это должно быть объединенным с Параллельными Расширениями).

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

я думаю, необходимо ли использовать nullable типы, лучше использовать Nullable<.T>, а не нотация вопросительного знака. Это делает его глазом ноюще очевидный, что волшебство происходит. Не уверенный, почему любой когда-либо хотел бы использовать Nullable< .bool> все же.

В веб-сервисе VB.NET, куда параметр не мог бы быть передан до (потому что партнеры запрашивают, не было последовательно или надежен) , но должен был передать проверку против предложенного типа (булевская переменная для, "если поисковый запрос") . Рисуйте мелом его до "другого требования управления"...

... и да, я знаю, что некоторые люди думают, что это не правильный способ сделать эти вещи, но IsSearchRequest, Поскольку Nullable (булевской переменной) сохранил меня сходящий с ума той ночью!

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

ThreadStaticAttribute является моим фаворитом. Кроме того, NonSerializableAttribute полезен. (Можно ли сказать, что я делаю много материала сервера с помощью дистанционной работы?)

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

Функция Платформы

я не знаю, но я был вполне удивлен [приблизительно 110] VisualStyleRenderer и целое Система. Windows. Формы. VisualStyles-пространство-имен . Довольно прохладный!

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

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

необходимо использовать DBNull.value, когда Вы хотите видеть, является ли значение от записи базы данных пустым.

4
ответ дан Ian Andrews 25 September 2017 в 20:53
поделиться

ContextBoundObject

Не так вещь C# как вещь.NET. Это - другой способ достигнуть DI, хотя это может быть hardwork. И необходимо наследоваться ему, который может быть от помещения.

http://msdn.microsoft.com/en-us/library/system.contextboundobject.aspx

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

3
ответ дан Scott McKenzie 25 September 2017 в 20:53
поделиться

Возврат проекции IQueryable

protected void LdsPostings_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{   
    var dc = new MyDataContext();
    var query = dc.Posting.AsQueryable();

    if (isCondition1)
    {
        query = query.Where(q => q.PostedBy == Username);
        e.Result = QueryProjection(query);
        return;
    }

    ...

    if (isConditionN)
    {
        query = query.Where(q => q.Status.StatusName == "submitted");
        query = query.Where(q => q.ReviewedBy == Username);
        e.Result = QueryProjection(query);
        return;
    }
}

и вместо того, чтобы кодировать проекцию многократно, создайте отдельный метод:

private IQueryable QueryProjection(IQueryable<Posting> query)
{
    return query.Select(p => new
    {
        p.PostingID,
        p.Category.CategoryName,
        p.Type.TypeName,
        p.Status.StatusName,
        p.Description,
        p.Updated,
        p.PostedBy,
        p.ReviewedBy,
    });
}
3
ответ дан nemoby 25 September 2017 в 20:53
поделиться

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

double doubleValue
if (!Double.TryParse(myDataRow("myColumn"), out doubleValue))
{
    // set validation error
}
4
ответ дан 3 revs, 2 users 76% 25 September 2017 в 20:53
поделиться

Одна интересная вещь, которую я изучил, состоит в том, что различные части платформы и языка C# были записаны в разное время, следовательно несоответствия. Например, сама платформа нарушает много правил FxCop, потому что правила существовали не все, когда платформа была записана.

кроме того, оператор использования был предназначен для delinieating "объемы" а не специально для расположения ресурсов. Это было записано после оператора блокировки. Eric Gunnerson когда-то упомянул что-то вроде того, что, если оператор использования был на первом месте, они могли бы иметь не нужный для записи оператора блокировки (хотя, кто знает, возможно, они имели бы так или иначе), потому что оператор использования, возможно, был достаточен.

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

#region {строка} и #endregion пара очень аккуратен для группировки кода (выделение).

#region Using statements
using System;
using System.IO;
using ....;
using ....;
#endregion

блок кода может быть сжат до единственной строки описания текста. Работы в функционируют также.

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

Методы get ViewState могут быть остротами.

Используя значение по умолчанию:

public string Caption
{
    get { return (string) (ViewState["Caption"] ?? "Foo"); }
    set { ViewState["Caption"] = value; }
}

public int Index
{
    get { return (int) (ViewState["Index"] ?? 0); }
    set { ViewState["Index"] = value; }
}

Используя пустой указатель как значение по умолчанию:

public string Caption
{
    get { return (string) ViewState["Caption"]; }
    set { ViewState["Caption"] = value; }
}

public int? Index
{
    get { return (int?) ViewState["Index"]; }
    set { ViewState["Index"] = value; }
}

Это работает на что-либо поддержанное словарем.

3
ответ дан Bryan Watts 25 September 2017 в 20:53
поделиться

Ключевое слово параметрических усилителей, т.е.

public void DoSomething(params string[] theStrings)
{
  foreach(string s in theStrings)
  {
    // Something with the Strings…
  }
}

Названный как

DoSomething(“The”, “cat”, “sat”, “on”, “the” ,”mat”);
45
ответ дан 3 revs, 3 users 83% 25 September 2017 в 20:53
поделиться
double dSqrd = Math.Pow(d,2.0); 

более точно, чем

double dSqrd = d * d; // Here we can lose precision
3
ответ дан Jan Bannister 25 September 2017 в 20:53
поделиться

Просто изученный радости [UnmanagedFunctionPointerAttribute(CallingConvention.CDecl)] от попытки взаимодействовать через интерфейс с неуправляемой библиотекой функций C++, которая определила обратные вызовы без __ stdcall.

4
ответ дан Dan Fleet 25 September 2017 в 20:53
поделиться

Больше функции во время выполнения, но я недавно узнал, что существует два сборщика "мусора". Gc рабочей станции и рабочая станция gc сервера являются значением по умолчанию на версиях клиента окон, но сервер намного быстрее на многоядерных машинах.


<configuration>
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

Быть осторожным. Gc сервера требует большей памяти.

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

Я думаю, что много людей знает об указателях в C, но не уверено, работает ли он в C#. Можно использовать указатели в C# в небезопасном контексте:

static void Main()
{
    int i;
    unsafe
    {               
        // pointer pi has the address of variable i
        int* pi = &i; 
        // pointer ppi has the address of variable pi
        int** ppi = &pi;
        // ppi(addess of pi) -> pi(addess of i) -> i(0)
        i = 0;
        // dereference the pi, i.e. *pi is i
        Console.WriteLine("i = {0}", *pi); // output: i = 0
        // since *pi is i, equivalent to i++
        (*pi)++;
        Console.WriteLine("i = {0}", *pi); // output: i = 1
        // since *ppi is pi, one more dereference  *pi is i 
        // equivalent to i += 2
        **ppi += 2;
        Console.WriteLine("i = {0}", *pi);// output: i = 3
    }
    Console.ReadLine();
}
4
ответ дан 2 revs, 2 users 96% 25 September 2017 в 20:53
поделиться
System.Diagnostics.Debug.Assert (false);

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

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

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

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

События являются действительно делегатами под капотом, и любой объект делегата может иметь несколько функций, присоединенных к нему, и отсоединился от него с помощью + = и - = операторы, соответственно.

Событиями можно также управлять с добавлением/удалением, подобный для получения/устанавливания кроме, они вызываются, когда + = и - = используются:

public event EventHandler SelectiveEvent(object sender, EventArgs args) 
  { add 
     { if (value.Target == null) throw new Exception("No static handlers!");
       _SelectiveEvent += value;
     }
    remove
     { _SelectiveEvent -= value;
     }
  } EventHandler _SelectiveEvent;
64
ответ дан 2 revs 25 September 2017 в 20:53
поделиться

Словарь. TryGetValue (K ключ, V значений)

Работы как проверка и получать в одном. Вместо;

if(dictionary.ContainsKey(key)) 
{
    value = dictionary[key];
    ...
}

можно просто сделать;

if(dictionary.TryGetValue(key, out value)) 
{ ... }

и значение был установлен.

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

IEnumerable SelectMany, который сглаживает список списков в единственный список. Скажем, у меня есть список Orders, и у каждого Order есть список LineItems на том порядке.

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

int totalItems = Orders.Select(o => o.LineItems).SelectMany(i => i).Sum();
9
ответ дан Richard Everett 25 September 2017 в 20:53
поделиться
  • TransactionScope и DependentTransaction в Системе. Транзакции являются легким способом использовать обработку транзакций в.NET - это не только для Транзакции базы данных ни один
  • Строка. IsNullOrEmpty является тем, что я удивлен узнать, что много разработчиков не знает [приблизительно 113]
  • Список. ForEach - выполняют итерации через Ваш универсальный список с помощью метода делегата

существует больше, но это - три очевидных вершины моей головы...

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

Прежде чем лямбда играет роль, это - анонимный делегат. Это могло использоваться для общего кода, подобного blockgiven Ruby. Я не протестировал, как лямбда работает хотя, потому что я хочу придерживаться.NET 2.0 до сих пор.

, Например, когда Вы хотите удостовериться, что Вы не забываете закрывать свои HTML-тэги:

MyHtmlWriter writer=new MyHtmlWriter();
writer.writeTag("html", 
  delegate ()
  { 
    writer.writeTag("head", 
       delegate() 
       { 
           writer.writeTag("title"...);
       }
    )
  })

я уверен, является ли лямбда опцией, которая могла бы привести к намного более чистому коду:)

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

Несколько вещей мне нравится:

- при создании интерфейса, подобного

 public interface SomeObject<T> where T : SomeObject<T>, new()

Вы вызываете что-либо, что наследовалось этому интерфейсу для содержания конструктора без параметров. Это очень полезно для нескольких вещей, на которые я натыкался.

- Используя анонимные типы для создания полезного объекта на лету:

var myAwesomeObject = new {Name="Foo", Size=10};

- Наконец, многие Java-разработчики знакомы с синтаксисом как:

public synchronized void MySynchronizedMethod(){}

Однако в C# это не допустимый синтаксис. Обходное решение является атрибутом метода:

 [MethodImpl(MethodImplOptions.Synchronized)]
 public void MySynchronizedMethod(){}
45
ответ дан 5 revs, 4 users 70% 25 September 2017 в 20:53
поделиться

Строковое интернирование. Это - то, которое я не видел, подходят в этом обсуждении все же. Это немного неясно, но в определенных условиях это может быть полезно.

CLR сохраняет таблицу ссылок на литеральные строки (и программно интернированные строки). При использовании той же строки в нескольких местах в коде, это будет сохранено однажды в таблице. Это может упростить объем памяти, требуемый для выделения строк.

можно протестировать, если строка интернируется при помощи Строка. IsInterned (строка) и можно интернировать строку с помощью Строка. Интерн (строка) .

Примечание: CLR может содержать ссылку на интернированную строку после приложения или даже конца AppDomain. См. документацию MSDN для деталей.

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

@David в Дакоте:

Console.WriteLine( "-".PadRight( 21, '-' ) );

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

new String('-',22);
47
ответ дан Konamiman 25 September 2017 в 20:53
поделиться