Variant vs C#
От: /Forester/ Россия http://www.akteam.ru
Дата: 15.02.14 14:52
Оценка: 1 (1)
Сегодня использовал варианты, объявленные в немерловой сборке, в C#.
Вот есть у нас такой код в Nemerle
  public variant Name
  {
      | Var1
      | Var2 { p : string }
  }

И вот так мы хотим использовать его в C#
var var1 = new Name.Var1(); // Get compiler error "has no constructors defined"
var var2 = new Name.Var2(""); // It is compiled

В первой строке получаем ошибку, так как если у варианта нет полей, то компилятор реализует его синглтоном. То есть делает приватный конструктор, а экземпляр сохраняет в статическом поле _N_constant_object.
Использовать варианты в C# следует вот так:
var var1 = Name.Var1._N_constant_object;
var var2 = new Name.Var2("");

Не красиво...

Я понимаю, что это оптимизация, что если писать на Nemerle, то никаких проблем с вариантами нет. Но периодически приходится сопрягать код немерле и C# и тогда подобные вещи бросаются в глаза. Мои соображения, как сделать сопряжение в этом месте более гладким:
1. Хотя бы переименовать _N_constant_object во что-то более читабельное, Instance например.
2. Можно открыть у варианта без параметров конструктор. Код Nemerle останется оптимизированным, код C#, который использует варианты, будет неоптимизирован.
3. Можно закрыть конструктор и у варианта с параметрами. Работать с вариантом как-то так:
var var1 = Name.Var1.Instance;
var var2 = Name.Var2.Instance[""];
Re: Variant vs C#
От: _NN_ www.nemerleweb.com
Дата: 16.02.14 06:40
Оценка:
Здравствуйте, /Forester/, Вы писали:


F>Я понимаю, что это оптимизация, что если писать на Nemerle, то никаких проблем с вариантами нет. Но периодически приходится сопрягать код немерле и C# и тогда подобные вещи бросаются в глаза. Мои соображения, как сделать сопряжение в этом месте более гладким:

F>1. Хотя бы переименовать _N_constant_object во что-то более читабельное, Instance например.
Префикс _N_ говорит о том, что это сгенерированный код, и его не стоит трогать.
F>2. Можно открыть у варианта без параметров конструктор. Код Nemerle останется оптимизированным, код C#, который использует варианты, будет неоптимизирован.
Этот вариант выглядит наиболее порядочным.
Какие были причины закрывать конструктор увы не знаю.
F>3. Можно закрыть конструктор и у варианта с параметрами. Работать с вариантом как-то так:
F>
F>var var1 = Name.Var1.Instance;
F>var var2 = Name.Var2.Instance[""];
F>

И зачем создавать фабрику вместо обычного конструктора ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Variant vs C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.14 08:32
Оценка:
Здравствуйте, /Forester/, Вы писали:

F>1. Хотя бы переименовать _N_constant_object во что-то более читабельное, Instance например.

F>2. Можно открыть у варианта без параметров конструктор. Код Nemerle останется оптимизированным, код C#, который использует варианты, будет неоптимизирован.
F>3. Можно закрыть конструктор и у варианта с параметрами. Работать с вариантом как-то так:

Во-первых действительно, надо стараться не выставлять варианты в публичный интересный предназначенный для других языков. В любом случае использовать вариантные типы из Шарпа будет неудобно.

Во-вторых, раз уж это происходит, можно сделать фабричные методы для создания экземпляров варианта:
public variant Name
{
  | Var1
  | Var2 { p : string }

  static CreateVar1() : Name { Var1() }
  static CreateVar2(p : string) : Name { Var2(p) }
}


Что касается внесения в язык каких-то возможностей. То тут нужно продумать как это должно выглядеть. Если найдем красивое решение, сделать его будет не сложно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.