Синтаксический оверхед в C# / Java
От: L.C.R. Россия lj://_lcr_
Дата: 04.07.05 23:37
Оценка: :)
Речь пойдет о new.

Наши любимые C# и Java имеют избыточный синтаксис для создания объекта — оба этих языка используют ключевое слово new для создания объектов в куче. Спрашивается, зачем оно (ключевое слово) нужно, если всё равно создавать на стеке объекты ссылочных типов невозможно, так что приписывание лишнего new не несёт никакого дополнительного смысла.

Не лучше ли использовать просто:
MyClass c = MyClass(10, 20);


В Джаве new было введено исключительно по политическим причинам, чтобы облегчить переход C++ программистов на Джаве облегчив им узнавание привычных конструкций (создание объектов в куче). В Шарп, вероятно, new было содрано с Джавы, дабы облегчить переход C++ и Джава — программистов на Шарп

Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических косяков (гипотетическое) исключение new из этих языков?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Синтаксический оверхед в C# / Java
От: Andir Россия
Дата: 04.07.05 23:48
Оценка: 2 (2) +5
Здравствуйте, L.C.R., Вы писали:

LCR>Речь пойдет о new.


[skip]

LCR>Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических косяков (гипотетическое) исключение new из этих языков?


По опыту языков Python, Boo. Могу сказать что слово new помогает визуально отделить создание объекта от вызова функции, что помогает при чтении кода. Хотя в этом случае может помочь и контекстно зависимая подстветка, но я такого не видел ( + требуется специализированный редактор).

C Уважением, Andir!
Re: Синтаксический оверхед в C# / Java
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 01:26
Оценка: 2 (1) +1
Здравствуйте, L.C.R., Вы писали:

LCR>Не лучше ли использовать просто:

LCR>
LCR>MyClass c = MyClass(10, 20);
LCR>


И чем это будет отличаться от вызова функции?
MyClass MyClass()
{
    return new MyClass();
}

static void Main()
{
    MyClass c = MyClass(10, 20);
}
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Синтаксический оверхед в C# / Java
От: Александр Сергеевич Россия  
Дата: 05.07.05 01:40
Оценка: -2
Здравствуйте, 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>


Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...
<<Winamp играет: silent>>
Re[3]: Синтаксический оверхед в C# / Java
От: SiAVoL Россия  
Дата: 05.07.05 04:49
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

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 7 rev. 501>>
Re[3]: Синтаксический оверхед в C# / Java
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.07.05 04:52
Оценка: +2
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...

Боюсь тебя разочаровать — еще как может.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Синтаксический оверхед в C# / Java
От: Трурль  
Дата: 05.07.05 05:06
Оценка: 1 (1) +1
Здравствуйте, VladD2, Вы писали:


VD>И чем это будет отличаться от вызова функции?

А зачем их различать?
Re: Синтаксический оверхед в C# / Java
От: Дарней Россия  
Дата: 05.07.05 05:06
Оценка: +1
Здравствуйте, L.C.R., Вы писали:

LCR>Вопрос: согласны ли вы, что new избыточен? Нет ли каких-нибудь синтаксических

косяков (гипотетическое) исключение new из этих языков?

нет, несогласны. Что здесь действительно избыточно — так это двойное повторение MyClass
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[4]: Синтаксический оверхед в C# / Java
От: Александр Сергеевич Россия  
Дата: 05.07.05 05:27
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Александр Сергеевич, Вы писали:


АС>>Этим. Тем что обычная функция(конструктор ведь тоже функция) не может совпадать с именем класса...

S>Боюсь тебя разочаровать — еще как может.
Не видел такого, покажи на примере 8)
<<Winamp играет: silent>>
Re[2]: Синтаксический оверхед в C# / Java
От: SiAVoL Россия  
Дата: 05.07.05 05:28
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Что здесь действительно избыточно — так это двойное повторение MyClass

а так?
class BaseClass
{}

class MyClass : BaseClass
{}

// ...

BaseClass bc = new MyClass();


как быть здесь без "двойного" повторения?
... << RSDN@Home 1.1.4 beta 7 rev. 501>>
Re[5]: Синтаксический оверхед в C# / Java
От: Sash_xp  
Дата: 05.07.05 05:37
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Здравствуйте, 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()
    {
    }
}

Нормально компилируется.
Re[3]: Синтаксический оверхед в C# / Java
От: Дарней Россия  
Дата: 05.07.05 05:39
Оценка: +1
Здравствуйте, SiAVoL, Вы писали:

SAV>как быть здесь без "двойного" повторения?


а здесь повторения и нет
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[2]: Синтаксический оверхед в C# / Java
От: L.C.R. Россия lj://_lcr_
Дата: 05.07.05 05:49
Оценка:
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 придётся и отказаться от соблазна называть классы и методы одними именами...

quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Синтаксический оверхед в C# / Java
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.07.05 05:53
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:
АС>Не видел такого, покажи на примере 8)
Re: Синтаксический оверхед в C# / Java
Автор: VladD2
Дата: 05.07.05
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Синтаксический оверхед в C# / Java
От: Кодёнок  
Дата: 05.07.05 06:00
Оценка: +1
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)
Re[2]: Синтаксический оверхед в C# / Java
От: Oyster Украина https://github.com/devoyster
Дата: 05.07.05 06:33
Оценка:
Здравствуйте, Кодёнок, Вы писали:

[... skipped ...]

Кё>Согласен, но ты не там копаешь. Лучше так:


Кё>
Кё>var c = new MyClass(10, 20);
Кё>


Кё>Т.е. дать возможность компилятору автоматически определять тип создаваемой переменной по типу (typeof) правой части.


А как же быть, например, с явными реализациями интерфейсов в C#? Т.е. если класс явно реализует несколько интерфейсов с одинаковыми именами членов, например, да вдобавок ещё и имеет собственный член с таким же именем? Или для интерфейсов специально использовать старый синтаксис?
Re[3]: Синтаксический оверхед в C# / Java
От: Кодёнок  
Дата: 05.07.05 06:39
Оценка:
Кё>>Согласен, но ты не там копаешь. Лучше так:
Кё>>var c = new MyClass(10, 20);
Кё>>Т.е. дать возможность компилятору автоматически определять тип создаваемой переменной по типу (typeof) правой части.

O>А как же быть, например, с явными реализациями интерфейсов в C#? Т.е. если класс явно реализует несколько интерфейсов с одинаковыми именами членов, например, да вдобавок ещё и имеет собственный член с таким же именем? Или для интерфейсов специально использовать старый синтаксис?


С трудом понимаю о чём ты — приведи код Да, старый синтаксис обязательно тоже должен остаться, `var` это просто ещё один синтаксический сахар для удобства, чтобы исключить лишнее имя типа в коде. Он просто как макрос, ничего не меняет.
Re[4]: Синтаксический оверхед в C# / Java
От: Oyster Украина https://github.com/devoyster
Дата: 05.07.05 06:44
Оценка:
Здравствуйте, Кодёнок, Вы писали:

[... 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() вызывать?

В общем-то, не вижу смысла в var.
Re[2]: Синтаксический оверхед в C# / Java
От: Oyster Украина https://github.com/devoyster
Дата: 05.07.05 06:48
Оценка:
Здравствуйте, Кодёнок, Вы писали:

[... 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 вызывать

IMHO: var в C# не место.
Re[3]: PS
От: Oyster Украина https://github.com/devoyster
Дата: 05.07.05 06:49
Оценка:
Здравствуйте, Oyster, Вы писали:

O>IMHO: var в C# не место.


... и Да здравствует строгая типизация!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.