Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Любому двоичному коду .NET может быть сопоставлен внешний конфигурационный файл XML. Этот файл располагается в том же каталоге, и имеет такое же имя с добавленным в конце словом .CONFIG;
var s = from f in Foo()
group f by f%2;
Как быстро в рантайме найти петли потоков (dead-locks)?
— !dlk
Объекты содержат в себе статические поля и все методы. Экземпляры содержат только не статические поля. Это значит, что методы не дублируются в каждом экземпляре, и здесь применяется паттерн Flyweight.Есть понятие («класс») и есть понятие («экземпляр класса», что по сути == «объект»). Используя такие термины, никогда не возникнет путаницы при изучении нового языка.
Также мне интересно, есть ли у разработчиков понимание, почему один и тот же метод у разных экземпляров класса в разных потоках не пересекается с другими и не меняет их значения, ведь по сути инструкции метода не дублируются?
По умолчанию обобщенные типы инвариантны. Еще обобщенные классы называют открытыми, в рантайме они закрываются конкретными типами «int», «string», например. И это разные типы, статические поля в них будут тоже разными.Какое отношение выделенное предложение имеет к ковариантности, контрвариантности или инвариантности?
У структурных типов и примитивных (byte,int,long...) нет блока синхронизации
Исключения медленно работают, т.к. происходит переход в режим ядра.
в) !DEBUG == RELEASE (на всякий случай).
31) Методы расширения
…
А это реализация паттерна Visitor в .Net.
Местами бред полный.
У структурных типов и примитивных (byte,int,long...) нет блока синхронизации
Я конечно не специалист, но разве у неупакованных ссылочных типов есть индекс блока синхронизации? По-моему как раз у них его и нет.
У структурных типов и примитивных (byte,int,long...) нет блока синхронизации
Исключения медленно работают, т.к. происходит переход в режим ядра.
При обработке исключения происходит серия переходов managed-unmanaged. Но сами такие переходы не страшны. К примеру, по два таких перехода происходит на каждый вызов делегата, если верить отладчику студии. Означает ли это, что делегатов надо избегать?Исключения медленно работают, т.к. происходит переход в режим ядра.
Формально да, это так. Хотя определение «медленно» для разных задач разное, так что нужно просто сказать что происходит переключение контекста потока.
Но при чем тут вообще режим ядра?
throw new Exception() — там нет ни слова.Probably take a trip through the OS kernel. Often take a hardware exception.Но тут говорится о возможном проходе через ядро — в случае использования отладчиков, профайлеров и прочих инструментов, которые при нормальной работе приложения отключены.
string — это тоже примитивный тип! Но будет ли кто-то спорить с тем, что у него есть все необходимое для синхронизации?Дело в том, что string — это тоже примитивный тип!
1) У структурных типов и примитивных (byte,int,long...) нет блока синхронизации, который присутствует у объектов в управляемой куче на ряду с ссылкой.Не вижу разницы, если честно.
Если не читать то что после запятой, то да, такое допущение будет ошибочным.
2) Методы расширения — прочитайте паттерн Visitor в бесплатной книге itvdn.com/ru/patterns (которая идет как дополнение к первоисточнику GOF).Спасибо, я знаю что такое паттерн Visitor. Не вижу, как в его реализации могут помочь методы расширения, которые являются всего лишь обычными статическими методами.
Я не сам это придумал, это ведь заметки а не мои домыслы.
Структура передает свою копию в метод, Класс передает копию своей ссылки. А вот когда мы используем ключевое слово REF — структура передает указатель на себя, а класс передает свою исходную ссылку.
[Serializable]
class Person
{
string FirstName { get; set; }
string SecondName { get; set; }
int Age { get; set; }
}
ILDASM.exe
Debug (first compile):
.field private int32 '<Age>k__BackingField'
.field private string '<FirstName>k__BackingField'
.field private string '<SecondName>k__BackingField'
Debug (second compile):
.field private int32 '<Age>k__BackingField'
.field private string '<FirstName>k__BackingField'
.field private string '<SecondName>k__BackingField'
Release (third compile):
.field private int32 '<Age>k__BackingField'
.field private string '<FirstName>k__BackingField'
.field private string '<SecondName>k__BackingField'
class Car
{
private string _name = "car";
private int _speed = 15;
private int _sits = 5;
public Car()
{
}
public Car(string name)
{
this._name = name;
}
public Car(int speed)
{
this._speed = speed;
}
public Car(int speed ,int sits)
{
this._speed = speed;
this._sits = sits;
}
}
// Code size 43 (0x2b)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "car"
IL_0006: stfld string ConsoleApplication1.Car::_name
IL_000b: ldarg.0
IL_000c: ldc.i4.s 15
IL_000e: stfld int32 ConsoleApplication1.Car::_speed
IL_0013: ldarg.0
IL_0014: ldc.i4.5
IL_0015: stfld int32 ConsoleApplication1.Car::_sits
IL_001a: ldarg.0
IL_001b: call instance void [mscorlib]System.Object::.ctor()
IL_0020: nop
IL_0021: nop
IL_0022: ldarg.0
IL_0023: ldarg.1
IL_0024: stfld string ConsoleApplication1.Car::_name
IL_0029: nop
IL_002a: ret
} // end of method Car::.ctor
// Code size 43 (0x2b)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "car"
IL_0006: stfld string ConsoleApplication1.Car::_name
IL_000b: ldarg.0
IL_000c: ldc.i4.s 15
IL_000e: stfld int32 ConsoleApplication1.Car::_speed
IL_0013: ldarg.0
IL_0014: ldc.i4.5
IL_0015: stfld int32 ConsoleApplication1.Car::_sits
IL_001a: ldarg.0
IL_001b: call instance void [mscorlib]System.Object::.ctor()
IL_0020: nop
IL_0021: nop
IL_0022: ldarg.0
IL_0023: ldarg.1
IL_0024: stfld int32 ConsoleApplication1.Car::_speed
IL_0029: nop
IL_002a: ret
} // end of method Car::.ctor
// Code size 50 (0x32)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldstr "car"
IL_0006: stfld string ConsoleApplication1.Car::_name
IL_000b: ldarg.0
IL_000c: ldc.i4.s 15
IL_000e: stfld int32 ConsoleApplication1.Car::_speed
IL_0013: ldarg.0
IL_0014: ldc.i4.5
IL_0015: stfld int32 ConsoleApplication1.Car::_sits
IL_001a: ldarg.0
IL_001b: call instance void [mscorlib]System.Object::.ctor()
IL_0020: nop
IL_0021: nop
IL_0022: ldarg.0
IL_0023: ldarg.1
IL_0024: stfld int32 ConsoleApplication1.Car::_speed
IL_0029: ldarg.0
IL_002a: ldarg.2
IL_002b: stfld int32 ConsoleApplication1.Car::_sits
IL_0030: nop
IL_0031: ret
} // end of method Car::.ctor
class Car
{
private string _name;
private int _speed;
private int _sits;
public Car()
{
this._name = "car";
this._speed = 15;
this._sits = 5;
}
public Car(string name) : this()
{
this._name = name;
}
public Car(int speed) : this()
{
this._speed = speed;
}
public Car(int speed ,int sits) : this()
{
this._speed = speed;
this._sits = sits;
}
}
// Code size 17 (0x11)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void ConsoleApplication1.Car::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfld string ConsoleApplication1.Car::_name
IL_000f: nop
IL_0010: ret
} // end of method Car::.ctor
// Code size 17 (0x11)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void ConsoleApplication1.Car::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfld int32 ConsoleApplication1.Car::_speed
IL_000f: nop
IL_0010: ret
} // end of method Car::.ctor
// Code size 24 (0x18)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void ConsoleApplication1.Car::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfld int32 ConsoleApplication1.Car::_speed
IL_000f: ldarg.0
IL_0010: ldarg.2
IL_0011: stfld int32 ConsoleApplication1.Car::_sits
IL_0016: nop
IL_0017: ret
} // end of method Car::.ctor
Интересные заметки по C# и CLR