рдЬрд╛рд╡рд╛ рдмрдирд╛рдо C # ... рдПрдХ рд╢рд╛рд╢реНрд╡рдд рддрд░реНрдХ рд╕реЗ рдмреЗрд╣рддрд░ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдирд╣реАрдВ, рдпрд╣ рд▓реЗрдЦ рдЕрдЧрд▓реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдкрд╡рд┐рддреНрд░ рдпреБрджреНрдз рднреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд╡рд╛рд▓ рдХреЗ рд▓рд╛рдпрдХ рднреА рдирд╣реАрдВ рд╣реИ: "рдЬреЛ рдХреВрд▓рд░ рд╣реИред"
рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХрд╛ рдЕрдкрдирд╛ рдЙрдкрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C # рдФрд░ рд░реВрдмреА рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЙрдирдХрд╛ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдкреНрд░рдХреГрддрд┐ рднреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ C # рдФрд░ Java рд╣реИ рдЬреЛ рдЙрдирдХреЗ рджрд░реНрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдирдЬрд╝рджреАрдХ рд╣реИрдВред
рдмрд╣реБрдд рдмрд╛рд░, рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕реА (!!!) рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ C # рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдирд╣реАрдВ)ред
рдпрджрд┐ рдЖрдк
рдмрд┐рдирд╛ рд╡рд┐рд╖рдпрд╡рд╕реНрддреБ рдХреЗ рд╕реА # рдФрд░ рдЬрд╛рд╡рд╛ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рднреА рдкрддрд╛ рд▓рдЧрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
History рдереЛрдбрд╝рд╛ рдЗрддрд┐рд╣рд╛рд╕
рд╕реА # рднрд╛рд╖рд╛ 2001 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА, рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рдХрд╛рд╕ 1999 рдореЗрдВ рд╡рд╛рдкрд╕ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рдпрд╣ рдЬрд╛рд╡рд╛ 1.4 рдХреЗ рд╕рдорд╛рди рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдзреБрдирд┐рдХ рд╕реА #, рдЬрд┐рд╕реЗ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 2.0 (рдЬреЛ рдХрд┐ рдЬрд╛рд╡рд╛ 5 рдХреЗ рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рдордп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рд░рд╛рдп рд╣реИ рдХрд┐ C # рдЬрд╛рд╡рд╛ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд▓реЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЕрд╕рд╣рдордд рд╣реВрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, C # рдХрд╛рдлреА рд╣рдж рддрдХ C "рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде" рдпрд╛ C ++ "рдорд╛рдирд╡ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕рд╛рде" рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдФрд░ рдЗрд╕рдореЗрдВ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдЗрд╕ рдХрдерди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВрдЧреЗред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд░реАрдЯреЗрд▓ рдореИрдВ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ рдЗрд╕рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдФрд░ рдкреНрд░рдореБрдЦ рдЕрдВрддрд░ рдФрд░ рдлрд╛рдпрджреЗ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред
рдкрд╣рд▓реЗ рд╣рдо рд╕реНрд╡рдпрдВ рдЬреЗрд╡реАрдПрдо рдФрд░ рдХреЙрдорди рд▓реИрдВрдЧреНрд╡реЗрдЬ рд░рдирдЯрд╛рдЗрдо (рд╕реАрдПрд▓рдЖрд░) рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ C # рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗред
тЦМ рдПрдкрд┐рд╕реЛрдб I: рдмрд╛рдпрдЯреЗрдХреЛрдб
.NET рдФрд░ Java рджреЛрдиреЛрдВ рд╣реА bytecode рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ - рдмрд╣реБрд░реВрдкрддрд╛ред
CIL (рдХреЙрдорди рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рд▓реИрдВрдЧреНрд╡реЗрдЬ, рдЙрд░реНрдл тАЛтАЛMSIL, рдЙрд░реНрдл тАЛтАЛIL) рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдХ (рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд) рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рдИрдЯреЗрдХреЛрдб рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЬрд╛рд╡рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
fadd - 2 рдлрд╝реНрд▓реЛрдЯреНрд╕,
iadd - 2
рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХрд╛ рдЬреЛрдбрд╝), рддреЛ CIL рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ ( рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ -
рдЬреЛрдбрд╝реЗрдВ , рдЬреЛ рдлреНрд▓реЛрдЯ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рджреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ)ред рдЙрдкрдпреБрдХреНрдд x86 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдкреАрдврд╝реА рддрдп рдХрд░рдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рдЬреЗрдЖрдИрдЯреА рдХреЗ рд╕рд╛рде рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред
рджреЛрдиреЛрдВ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред
рдЬрд╛рд╡рд╛ рдФрд░
CIL рдмрд╛рдЗрдЯрдХреЛрдб рдЖрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Java рдореЗрдВ 206 рдФрд░ CIL 232 рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдирд╣реАрдВ рднреВрд▓рддреЗ рд╣реИрдВ рдХрд┐ Java рдореЗрдВ рдХрдИ рдХрдорд╛рдВрдб рдмрд╕ рдПрдХ рджреВрд╕рд░реЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред
тЦМ рдПрдкрд┐рд╕реЛрдб III: рдЬреЗрдирд░рд┐рдХ (рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ || рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рдЗрд░реЗрдЬрд╝рд░ рдореИрдХреЗрдирд┐рдЬреНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЬреЗрдирд░рд┐рдХ рд╕рдорд░реНрдерди рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб:
List<String> strList = new ArrayList<String>();
List<Integer> intList = new ArrayList<Integer>();
bool areSame = strList.getClass() == intList.getClass();
System.out.println(areSame);
true.
T java.lang.Object.
List<String> strList = new ArrayList<String>();
strList.add("stringValue");
String str = strList.get(0);
:
List list = new ArrayList();
list.add("stringValue");
String x = (String) list.get(0);
,
.
.NET, ,
generics compile-time, run-time.
generics Java? , .NETтАЩa:
- generics Common Type System -
- Reflection API
- / (Base Class Library)
- generics JIT (code-sharing)
- CIL ( -)
- CIL-
.. generics , . boxing/unboxing.
тЦМ IV: Types
Java -. . : (integer, float ..) java.lang.Object. generics Java primitive types.
- -
everything is object.
. .
C# . тАУ
struct.
:
public struct Quad
{
int X1;
int X2;
int Y1;
int Y2;
}
generics C# value types (int, float ..)
Java :
List<Integer> intList = new ArrayList<Integer>();
:
List<Integer> intList = new ArrayList<int>();
C# .
.NET.
.NET 3 : value, reference pointer types.
,
value type тАУ primitive type Java.
System.Object, , ( : value type , , boxing).
Reference type тАУ , reference types Java.
Pointer type тАУ .NETтАЩa. , CLR !
:
struct Point
{
public int x;
public int y;
}
unsafe static void PointerMethod()
{
Point point;
Point* p = &point;
p->x = 100;
p->y = 200;
Point point2;
Point* p2 = &point2;
(*p2).x = 100;
(*p2).y = 200;
}
C++ , ?
тЦМ V: C#
, C#:
- ( )
- -
- LINQ
- Expression Trees
- Indexers
- тАж
C# , ..
GetXXX,
SetXXX. ,
object.PropertyX,
object.GetPropertyX.
:
public class TestClass
{
public int TotalSum
{
get
{
return Count * Price;
}
}
// -
public int Count
{
get;
set;
}
public int Price
{
get
{
return 50;
}
}
}
:
public class TestClass
{
/*
*
*/
private int <Count>k__BackingField;
// -
public int Count
{
get { return <Count>k__BackingField; }
set { <Count>k__BackingField = value; }
}
}
C/C++. . тАУ callback , .
.NET тАУ
.
DLR (Dynamic Language Runtime тАУ .NET), dynamic C# 4 тАУ .
C# dynamic.
Da Vinci Java, .. VM.
C#:
public class TestClass
{
public delegate int BinaryOp(int arg1, int arg2);
public int Add(int a, int b)
{
return a + b;
}
public int Multiply(int first, int second)
{
return first * second;
}
public void TestDelegates()
{
BinaryOp op = new BinaryOp(Add);
int result = op(1, 2);
Console.WriteLine(result);
//: 3
op = new BinaryOp(Multiply);
result = op(2, 5);
Console.WriteLine(result);
//: 10
}
}
C:
int Add(int arg1, int arg2)
{
return arg1 + arg2;
}
void TestFP()
{
int (*fpAdd)(int, int);
fpAdd = &Add; //
int three = fpAdd(1, 2); //
}
, ? C ( float arg1, float arg2), C# тАФ . C# , .
- . , EventDispatcherтАЩ, Publisher/Subscriber. .
.
:
public class MyClass
{
private string _value;
public delegate void ChangingEventhandler(string oldValue);
public event ChangingEventhandler Changing;
public void OnChanging(string oldvalue)
{
ChangingEventhandler handler = Changing;
if (handler != null)
handler(oldvalue);
}
public string Value
{
get
{
return _value;
}
set
{
OnChanging(_value);
_value = value;
}
}
public void TestEvent()
{
MyClass instance = new MyClass();
instance.Changing += new ChangingEventhandler(instance_Changing);
instance.Value = "new string value";
// instance_Changing
}
void instance_Changing(string oldValue)
{
Console.WriteLine(oldValue);
}
}
тАУ , .. .
:
public class TestClass
{
public delegate int BinaryOp(int arg1, int arg2);
public void TestDelegates()
{
BinaryOp op = new BinaryOp(delegate(int a, int b)
{
return a + b;
});
int result = op(1, 2);
Console.WriteLine(result);
//: 3
}
}
?
-.
- тАФ , , .
public class TestClass
{
public delegate int BinaryOp(int arg1, int arg2);
public void TestDelegates()
{
BinaryOp op = new BinaryOp((a, b) => a + b);
int result = op(1, 2);
Console.WriteLine(result);
//: 3
}
}
? :
public class MyClass
{
/*
*
*/
public void TestEvent()
{
MyClass instance = new MyClass();
instance.Changing += (o) => Console.WriteLine(o);
instance.Value = "new string value";
// Console.WriteLine
}
}
, (!!!). , C# , .. .
-,
LINQ (Language Integrated Query).
LINQ? MapReduce LINQ?
public static class MyClass
{
public void MapReduceTest()
{
var words = new[] {"...some text goes here..."};
var wordOccurrences = words
.GroupBy(w => w)
.Select(intermediate => new
{
Word = intermediate.Key,
Frequency = intermediate.Sum(w => 1)
})
.Where(w => w.Frequency > 10)
.OrderBy(w => w.Frequency);
}
}
SQL- :
public void MapReduceTest()
{
string[] words = new string[]
{
"...some text goes here..."
};
var wordOccurrences =
from w in words
group w by w
into intermediate
select new
{
Word = intermediate.Key,
Frequency = intermediate.Sum((string w) => 1)
}
into w
where w.Frequency > 10
orderby w.Frequency
select w;
}
LINQ (GroupBy().Select().Where() ..), тАУ
new
{
Word = intermediate.Key,
Frequency = intermediate.Sum(w => 1)
}
тАж ? тАУ .
var. C++ 11
auto.
:
public void MapReduceTest()
{
string[] words = new string[] { "...some text goes here..." };
var wordOccurrences = Enumerable.OrderBy(Enumerable.Where(Enumerable.Select(Enumerable.GroupBy<string, string>(words, delegate (string w) {
return w;
}), delegate (IGrouping<string, string> intermediate) {
return new { Word = intermediate.Key, Frequency = Enumerable.Sum<string>(intermediate, (Func<string, int>) (w => 1)) };
}), delegate (<>f__AnonymousType0<string, int> w) {
return w.Frequency > 10;
}), delegate (<>f__AnonymousType0<string, int> w) {
return w.Frequency;
});
}
[ ]C#, .. .
, C# 5 тАУ ,
, C++ 11!
тЦМ
C# Java , (.NET Java). тАФ .
C# тАФ Java. Microsoft, COOL (C-like Object Oriented Language). C/C++? .
, ( ) , .
!