Наши любимые C# и Java имеют избыточный синтаксис для создания объекта — оба этих языка используют ключевое слово new для создания объектов в куче. Спрашивается, зачем оно (ключевое слово) нужно, если всё равно создавать на стеке объекты ссылочных типов невозможно, так что приписывание лишнего new не несёт никакого дополнительного смысла.
Не лучше ли использовать просто:
MyClass c = MyClass(10, 20);
В Джаве new было введено исключительно по политическим причинам, чтобы облегчить переход C++ программистов на Джаве облегчив им узнавание привычных конструкций (создание объектов в куче). В Шарп, вероятно, new было содрано с Джавы, дабы облегчить переход C++ и Джава — программистов на Шарп
Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических косяков (гипотетическое) исключение new из этих языков?
Здравствуйте, L.C.R., Вы писали:
LCR>Речь пойдет о new.
[skip]
LCR>Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических косяков (гипотетическое) исключение new из этих языков?
По опыту языков Python, Boo. Могу сказать что слово new помогает визуально отделить создание объекта от вызова функции, что помогает при чтении кода. Хотя в этом случае может помочь и контекстно зависимая подстветка, но я такого не видел ( + требуется специализированный редактор).
Здравствуйте, Александр Сергеевич, Вы писали:
VD>>static void Main() VD>>{ VD>> MyClass c = MyClass(10, 20); VD>>} VD>>[/c#]
АС>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...
void f(MyClass mc)
{}
// много кода
f(MyClass(10, 20));
В данном случае сложно так сходу сказать что это, создание нового объекта или вызов функции класса. Конечно соглашения о кодировании могут разрулить эту ситуацию, но вообще говоря слово new никого не напрягает
Здравствуйте, Александр Сергеевич, Вы писали:
АС>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...
Боюсь тебя разочаровать — еще как может.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, L.C.R., Вы писали:
LCR>Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических
косяков (гипотетическое) исключение new из этих языков?
нет, несогласны. Что здесь действительно избыточно — так это двойное повторение MyClass
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Александр Сергеевич, Вы писали:
АС>>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса... S>Боюсь тебя разочаровать — еще как может.
Не видел такого, покажи на примере 8)
Здравствуйте, Александр Сергеевич, Вы писали:
АС>Здравствуйте, Sinclair, Вы писали:
S>>Здравствуйте, Александр Сергеевич, Вы писали:
АС>>>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса... S>>Боюсь тебя разочаровать — еще как может. АС>Не видел такого, покажи на примере 8)
public class Test {
int FunctionName()
{
return 1;
}
public static void main(String[] args)
{
System.out.println("Hello, world");
}
}
class FunctionName
{
public void doF()
{
}
}
VladD2,
VD>И чем это будет отличаться от вызова функции? VD>
VD>MyClass MyClass()
VD>{
VD> return new MyClass();
VD>}
VD>static void Main()
VD>{
VD> MyClass c = MyClass(10, 20);
VD>}
VD>
Да, действительно, введение new разрешает совпадение имён классов и методов. Так что при отказе от new придётся и отказаться от соблазна называть классы и методы одними именами...
LCR>Наши любимые C# и Java имеют избыточный синтаксис для создания объекта — оба этих языка используют ключевое слово new для создания объектов в куче. Спрашивается, зачем оно (ключевое слово) нужно, если всё равно создавать на стеке объекты ссылочных типов невозможно, так что приписывание лишнего new не несёт никакого дополнительного смысла.
LCR>Не лучше ли использовать просто: LCR>MyClass c = MyClass(10, 20);
LCR>Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических косяков (гипотетическое) исключение new из этих языков?
Согласен, но ты не там копаешь. Лучше так:
var c = new MyClass(10, 20);
Т.е. дать возможность компилятору автоматически определять тип создаваемой переменной по типу (typeof) правой части. Если бы в С++ был typeof, это можно было бы выразить макросом:
#define DEF_VAR(name, expr) typeof(expr) name = expr
// т.е.
DEF_VAR(c,new MyClass(10,20))
// аналогично
typeof(new MyClass(10,20)) c = new MyClass(10,20)
[... skipped ...]
Кё>Согласен, но ты не там копаешь. Лучше так:
Кё>
Кё>var c = new MyClass(10, 20);
Кё>
Кё>Т.е. дать возможность компилятору автоматически определять тип создаваемой переменной по типу (typeof) правой части.
А как же быть, например, с явными реализациями интерфейсов в C#? Т.е. если класс явно реализует несколько интерфейсов с одинаковыми именами членов, например, да вдобавок ещё и имеет собственный член с таким же именем? Или для интерфейсов специально использовать старый синтаксис?
Кё>>Согласен, но ты не там копаешь. Лучше так: Кё>>var c = new MyClass(10, 20); Кё>>Т.е. дать возможность компилятору автоматически определять тип создаваемой переменной по типу (typeof) правой части.
O>А как же быть, например, с явными реализациями интерфейсов в C#? Т.е. если класс явно реализует несколько интерфейсов с одинаковыми именами членов, например, да вдобавок ещё и имеет собственный член с таким же именем? Или для интерфейсов специально использовать старый синтаксис?
С трудом понимаю о чём ты — приведи код Да, старый синтаксис обязательно тоже должен остаться, `var` это просто ещё один синтаксический сахар для удобства, чтобы исключить лишнее имя типа в коде. Он просто как макрос, ничего не меняет.
[... skipped ...]
O>>А как же быть, например, с явными реализациями интерфейсов в C#? Т.е. если класс явно реализует несколько интерфейсов с одинаковыми именами членов, например, да вдобавок ещё и имеет собственный член с таким же именем? Или для интерфейсов специально использовать старый синтаксис?
Кё>С трудом понимаю о чём ты — приведи код Да, старый синтаксис обязательно тоже должен остаться, `var` это просто ещё один синтаксический сахар для удобства, чтобы исключить лишнее имя типа в коде. Он просто как макрос, ничего не меняет.
interface I1
{
string Run();
}
interface I2
{
string Run();
}
class C1 : I1, I2
{
public string Run()
{
return"C1 is running";
}
string I1.Run()
{
return"I1 is running";
}
string I2.Run()
{
return"I2 is running";
}
}
// используемый код
C1 x = new C1();
Console.WriteLine(x.Run()); // C1 is running
Console.WriteLine(((I1)x).Run()); // I1 is running
Console.WriteLine(((I2)x).Run()); // I2 is running
// гипотетический кодvar x2 = new C1();
Console.WriteLine(x2.Run()); // ну и какой же Run() вызывать?
[... skipped ...]
Кё>Согласен, но ты не там копаешь. Лучше так:
Кё>
Кё>var c = new MyClass(10, 20);
Кё>
Кё>Т.е. дать возможность компилятору автоматически определять тип создаваемой переменной по типу (typeof) правой части.
А как это будет вообще работать с наследованием? Вот ещё пример из C#:
public class Base
{
virtual public string Hello()
{
return"Hi from Base";
}
}
public class Derived : Base
{
new public string Hello()
{
return"Hi from Derived";
}
}
// работающий код
Base x = new Derived();
Console.WriteLine(x.Hello()); // Hi from Base
Console.WriteLine(((Derived)x).Hello()); // Hi from Derived
// гипотетический кодvar x2 = new Derived();
Console.WriteLine(x2.Hello()); // опять же, какой Hello вызывать