В #2/2008
argc&argv прочитал чудную статью за авторством Татьяны Поляковой. Статья называется "Что нового в C# 3.0?" Цитировать статью не буду, кто читает - сам найдёт места в ней, кто не читает, но "в теме" - знает, как реализованы эти возможности в C#. А кто "не в теме", тому это не особенно и надо. Ну что, поехали?..
Неявное задание типа:
Availability: ActionScript 1.0; Flash Player 5
var str = "Hello, world!";
var someVar = this;
var someArr = ["1","2","3"];
var someFunc = this.attachMovie;
trace("Type of str: "+typeof(str)); //Type of str: string
trace("Type of someVar: "+typeof(someVar)); //Type of someVar: movieclip
trace("Type of someArr: "+typeof(someArr)); //Type of someArr: object
trace("Content of someArr: "+someArr); //Content of someArr: 1,2,3
trace("Type of someFunc: "+typeof(someFunc)); //Type of someFunc: function
А на функцию через var в C# сослаться слабо? =)
Теперь варианты:
var str; - вполне нормально компилируется, несмотря на то, что переменная не инициализирована значением (в действительности она всё же инициализируется значением undefined и становится типа undefined)
Массивы могут в себе содержать элементы разных типов без ограничений:
var someArr = ["Flash","is",true,"C#",3.0,"is",false];
trace("Type of someArr: "+typeof(someArr)); //Type of someArr: object
trace("Content of someArr: "+someArr); //Content of someArr: Flash,is,true,C#,3,is,false
Автоматические свойства:
Availability: ActionScript 2.0; Flash Player 6
Листинг класса:
class Contact {
private var _yob:Number;
public var Name:String;
function set YearOfBirth(value:Number) {
if (value >= 1900 && value <= 2008)
this._yob=value;
else
this._yob=0;
}
function get YearOfBirth() {
return this._yob;
}
}
Пример использования:
import Contact;
var myContact:Contact = new Contact();
myContact.YearOfBirth = 1945;
trace(myContact.YearOfBirth); //1945
myContact.YearOfBirth = 3000;
trace(myContact.YearOfBirth); //0
myContact.Name = "John Doe";
trace(myContact.Name); //John Doe
Инициализаторы объекта:
Availability: ActionScript 1.0; Flash Player 5
var myObj = {Name:"John Doe",YearOfBirth:1945};
trace(typeof(myObj)); //object
trace(myObj.Name); //John Doe
К сожалению, таким образом нельзя инициализировать объект класса отличного от "Object". Тут, надо признать, Micro$oft ActionScript делает.
Инициализаторы коллекций:
Availability: ActionScript 1.0; Flash Player 5
Ну тут всё просто:
var Contacts = [
new Contact({Name:"John",YearOfBirth:1980}),
new Contact({Name:"Mary",YearOfBirth:1986}),
new Contact({Name:"Richard",YearOfBirth:1948})
];
Анонимные типы:
Availability: ActionScript 1.0; Flash Player 5
var contact1 = {
id:"54321",
Name:"Wei-Meng Lee",
email:"weimenglee@learn2develop.net",
myName:function(){trace("My name is "+this.Name)} //Метод в качестве бонуса
};
contact1.myName(); //My name is Wei-Meng Lee
Выражение Lambda:
Availability: ActionScript 1.0; Flash Player 6
this.onMouseUp = function(){trace("Mouse released on "+this+" movieclip");}
LINQ:
Нет, так как нет нативной поддержки SQL.
Методы расширения:
Availability: ActionScript 1.0; Flash Player 6
Point.prototype.DistanceFromThisPointTo = function(PointB:Point){
return Math.sqrt(
Math.pow((this.x - PointB.x),2) +
Math.pow((this.y - PointB.y),2));
}
Частичные методы:
Решается, в зависимости от случая, использованием прототипов или интерфейсов. Причём, без таких чудовищных ограничений.
Выводы:
Буду краток.
Нумберо уно: нового в C# 3.0 ничего. Большинство "фич" были реализованы (проще и качественнее) ещё в Flash Player 5, на ActionScript 1.
Нумберо дос: пока Micro$oft пищит про то, что Silverlight убийца Flash, последний задвигает C# и вообще всю .NET платформу. =)
Несогласных прошу в камменты. Холиварить не рекомендую.