Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Как ни странно, но goto в C# все еще поддерживается. Хотя не особо нужен.
switch(variable)
{
case 1:
Console.WriteLine("case 1");
//need break, goto case, return or throw.
case 2:
Console.WriteLine("case 2");
break;
default:
Console.WriteLine("default");
break;
}
switch(variable)
{
case 1:
Console.WriteLine("case 1");
goto case 2;
case 2:
Console.WriteLine("case 2");
break;
default:
Console.WriteLine("default");
break;
}
не представляю случая, когда такая необходимость была бы неохбодима
не представляю случая, когда такая необходимость была бы неохбодима
try{
myEvent1.Reset();
myEvent2.WaitOne();
for (;;){
for (;;){ goto labelExit;
}
labelExit:;
}
}
finally{
myEvent1.Set();
}
switch(variable)
{
case 1:
case 2:
Console.WrileLine("case 1");
Console.WrileLine("case 2");
break;
default:
Console.WrileLine("default");
break;
}
i в конце итерации, или переиспользуется. В данном случае переиспользуется. Чтобы исправить ситуацию достаточно либо завести новую переменную внутри цикла, либо использовать foreach (int i in Enumerable.Range(0, 10)) начиная с C# 4.i в таком случае будет находиться в куче, в инстансе специалного класса замыкания, и будет уничтожена только после GC.Func<int> F(int i) { return () => i; }Есть мысль, что захватывать можно только константы.
if (a is B) { /* переменная a типа B */ } по этой же самой причине отклонили. Нельзя так просто взять и узнать, модифицируется ли переменная в скоупе, или нет. Вместо этого будет использоваться синтаксис if (a is B b), создающий новую переменную, что и рекомендуется делать, если вы запутались с замыканиями.Нельзя так просто взять и узнать
Если компилятор может доказать что присваивание ровно одно — значит неизменяемая. Во всех остальных случаях считаем изменяемой.Если бы вы открыли статью, на которую я дал ссылку, вы бы увидели там объяснение, почему в C# это не так.
внутри метода F меняться значение не может
int все просто, он был скопирован на входе в метод и с тех пор неизменен, то с reference type все намного сложнее. надо метод базового класса сделать private
Самое весёлое, что такой код из задачи никто и никогда не стал бы писать.
static void Main(string[] args)
{
double x = secretFunction();
if (x != x)
{
Console.WriteLine("Вот так вот :D");
}
Console.ReadLine();
}
public static double secretFunction()
{
return 0.0/0.0;
}
Console.ReadLine();
Так и не понял, при чем тут код разных проектов?Чтобы слёту ответить на все вопросы, на мой взгляд, нужно иметь опыт, уже набив шишки на подобных чьих-то решениях в чужих проектах. Так как вопросы на мой взгляд не совсем тривиальные и даже сомнительные (в плане целесообразности использования), может понадобиться много времени, чтобы повстречать их ВСЕ в тех или иных реальных проектах. Почему в проектах и почему реальных? Потому что лично я не думаю, что можно заполучить соответствующие знания, лишь просто прочитав несколько книг.
delegate void SomeMethod();
static void Main(string[] args)
{
List<SomeMethod> delList = new List<SomeMethod>();
foreach (int i in System.Linq.Enumerable.Range(1, 10))
{
delList.Add(delegate { Console.WriteLine(i); });
}
foreach (var del in delList)
{
del();
}
}
Func<T>и прочие.
static void Main(string[] args)
{
var delList = Enumerable.Range(1, 3)
.Select(i => (Action) delegate { Console.WriteLine(i); });
foreach (var del in delList )
{
del();
}
}
delegate.
Каверзные вопросы по C#