Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class A {
public Action FooAct { get; protected set; }
public void Foo() { Console.WriteLine("A"); }
public A() { FooAct = Foo; }
}
class B : A {
public new void Foo() { Console.WriteLine("B"); }
public B() { FooAct = Foo; }
}
...
var a = new A();
var b = new B();
a.Foo(); //A
a.FooAct(); //A
b.Foo(); //B
b.FooAct(); //B
// А теперь самое интересное:
a = b;
a.Foo(); //A
a.FooAct(); //B :)
new FooA().Foo(); // A
new FooB().Foo(); // B
((IFoo)new FooA()).Foo(); // A
((IFoo)new FooB()).Foo(); // B
((FooA)new FooB()).Foo(); // A
((IFoo)(FooA)new FooB()).Foo(); // B
((IFoo)(FooA)new FooB()).Foo(); лишний кастинг к FooA (FooB уже является имплементацией IFoo).Но как только мы хотим go some math, компилятор сразу появляется из небытия и дает нам по рукам метровой линейкой. Не сметь, мол, захламлять мне код уравнениями!
int i = j = 0;int i = int j = 0;
int i = int j = 0; while((res=next_result())!=false)1)Конструктор базового класса всегда вызывается в С++, а в С# ему надо указывать, иначе не вызовется.
2)protected в С# позволяет вызвать методы базового класса только на this и не позволяет вызвать их на другом объекте того же класса, в C++ это можно.
3)Более строгая типизация, нельзя int использовать как bool, например, но это уже более очевидно.
int i = int j = 0;
Полагаю, что многие пришедшие в славный мир .NET из славного мира С++ прекрасно помнят, как им приходилось буквально впиваться в стандарт, чтобы разобраться, почему язык ведет себя именно так, а не иначе
int i = int j = 0;if((int i = 5) < 10) public override void SomeMethod(int data) : base (data) { }var dic = new Dictionary<string, string>();
...
if (var item = dic.TryGetValueOrDefault("Key") != null)
{
Console.WriteLine(item);
}
// xml предварительно проверили на валидность через xsd.
if (let node = root.SelectSingleNode("node")
node.Value == "value1" or node.Value == "value2")
{
...
}
представляете, можно было бы написать такое
dic.TryGetValueOrDefault("Key").Do(item => Console.WriteLine(item));
устанете копаться в закрывающихся скобочках
dic.TryGetValueOrDefault("Key").With(Console.WriteLine);
public static class TWith
{
public static void With<T>(this T t, Action<T> a) where T : class
{
if(t != null)
{
a(t);
}
}
}
if (dic.TryGetValue("Key", out var item))
{
Console.WriteLine(item);
}
#include <iostream>
int main()
{
int i;
std::cin >> i;
if (int j = i > 0)
{
std::cout << "ok!";
}
}
А нафига нам нужно что-то объявлять и инициализировать внутри «if»? Чтобы сразу провести сравнение? Или чтобы использовать в теле «if»'а?Google Go так умеет и это очень здорово.
do
{
bool repeat = // расчет в несколько строк
}
while (repeat);
while (bool repeat = true == true) // либо while (bool repeat = true; repeat)
{
...
}
for(bool repeat = true; repeat;)
{
...
}
while ((repeat = true) == true) // while (true)
{
...
}
while (repeat = (true == true)) // while (true)
{
...
}
static class Ext
{
public static XElement Element(this XElement el, string name)
{
if (el == null) return null;
return el.Element(name);
}
}
var name = root.Element(«Employee»).Element(«PersonInfo»).Attribute(«Name»).Value() ?? "";
var name = root.Element("Employee").With(e=>e.Element("PersonInfo").With(e=>e.Element("Name")).With(e=>e.Attribute("Name")).With(e=>e.Value) ?? "";
Возможно, но писать значительно проще.
root.With(r => r.Element("Employee").Element("PersonInfo").Attribute("Name").Value()) ?? ""
A jump statement such as a break is required after each case block, including the last block whether it is a case statement or a default statement. With one exception, (unlike the C++ switch statement), C# does not support an implicit fall through from one case label to another. The one exception is if a case statement has no code.
switch (...)
{
case ...:
int x = 5;
break;
case ...:
int x = 6; //Ошибка
break;
}
switch (...)
{
case ...:
{
int x = 5;
break;
}
case ...:
{
int x = 6; // Нет ошибки
break;
}
}switch (...)
{
case ...:
{
int x = 5;
break;
}
case ...:
{
int x = 6; // Нет ошибки
break;
}
}
Логично, но незаконно