Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
const, объявлены в классе, однако используются только компилятором — во все места их использования он подставляет фактические значения, не генерируя код обращения к полю. Это не оптимизация — среда CLR запрещает обращаться к константным полям так же, как к обычным.SomeMethod(x => OtherMethod(x)), это можно переписать короче: SomeMethod(OtherMethod).string.Empty нельзя использовать, например, в качестве значения для параметра по умолчанию — а литерал пустой строки можно.ExtensionAttribute, который подсказывает компилятору, что данный метод можно использовать как метод-расширение.int.MaxValue вполне можно. Почему string.Empty не сделали таким же константным полем, непонятно — ведь в MSIL есть инструкция для загрузки строки, аналогичная инструкции для загрузки числа.IsLiteral.typeof(int).GetField("MaxValue")Поля, помеченные как const, объявлены в классе, однако используются только компилятором — во все места их использования он подставляет фактические значения, не генерируя код обращения к полю.
Если в метод передается анонимная функция вида SomeMethod(x => OtherMethod(x)), это можно переписать короче: SomeMethod(OtherMethod)
Extension-методы можно в том числе вызывать как обычный статический метод, указывая имя класса и передавая объект явно в качестве первого параметра.
string.Empty нельзя использовать, например, в качестве значения для параметра по умолчанию — а литерал пустой строки можно.
Если в метод передается анонимная функция вида SomeMethod(x => OtherMethod(x)), это можно переписать короче: SomeMethod(OtherMethod).
Поля, помеченные как const, объявлены в классе, однако используются только компилятором
Фактически они различаются только тем, что на методе и содержащем его классе ставится атрибут ExtensionAttribute, который подсказывает компилятору, что данный метод можно использовать как метод-расширение.
В первом случае мы получим ошибку компиляции, поскольку индексатор коллекции это всего-навсего метод, который возвращает копию нашей структуры. Во втором случае мы ошибки не получим, поскольку индексация в массивах это не вызов метода, а обращение именно к нужному элементу.Обращение будет к копии экземпляра типа значения, а не к самому экземпляру.
using System;
namespace Tst
{
struct Node
{
public int Value;
}
class Program
{
static void Main()
{
var node = new Node {Value = 1};
var array = new[] {node};
array[0].Value = 2;
Console.WriteLine(node.Value); // Выведет 1
Console.ReadKey();
}
}
}
9. Вы не можете использовать константу с именем value__ в перечисленииАналогично нельзя использовать методы T get_XXX() и void set_XXX(T) внутри класса, если объявлено свойство T XXX {get; set;}
public class Node
{
public int Value { get; set; }
public int get_Value() // error: member with the same
// signature is already declared
{
return 1;
}
public void set_Value(int value) // error: member with the same
// signature is already declared
{
}
}
5. Перечисления могут иметь методы расширенияБолее того, даже примитивные типы могут иметь методы расширения.
namespace System.Runtime.CompilerServices {
public class ExtensionAttribute : Attribute {}
}
Я думаю перечисления — зло
1. Индексаторы могут использовать params параметры
2. Строковые литералы, определенные в вашем коде хранятся в единственном экземпляре
6. Порядок, в котором вы описываете статические переменные, имеет значение
8.Спецификация языка C# уже на вашем компьютере
9. Вы не можете использовать константу с именем value__ в перечислении
10. Инициализатор полей позволяет слишком много
11. Вы можете использовать только C# синонимы при описании базового типа перечисления
12. Структуры являются неизменяемыми, когда используются в коллекциях
О некоторых пунктах я не знал, например, просто потому, что никогда не использовал и даже не задумывался использовать в реальном коде.
When debugging, you can type $exception in the Watch\QuickWatch\Immediate window and get all the info on the exception of the current frame. This is very useful if you've got 1st chance exceptions turned on!
string s = string.Format("{0:positive;negative;zero}", i);
RealProxy lets you create your own proxies for existing types
Programmers moving from C/C++ may miss this one:
In C#, % (modulus operator) works on floats!
The extern alias keyword to reference two versions of assemblies that have the same fully-qualified type names.
Object.ReferenceEquals("what", "wh" + "at")static void Main()
{
var foo = "foo";
foo = 5;
}
// ...
class var
{
public static implicit operator var(string x)
{
return null;
}
public static implicit operator var(int x)
{
return null;
}
}
class Foo
{
public Bar Bar;
}
class Bar
{
public int Value;
}
static void Main()
{
var foo = new Foo() {Bar = {Value = 5}};
}
8 фактов, которые вы, возможно, не знали о C#