[ANN] C# 4.0 Indexed Properties
От: Кирилл Осенков Украина
Дата: 21.10.09 07:10
Оценка: 77 (5)
Мы в Beta 2 добавили новую фичу в язык: теперь можно вызывать свойства с параметрами при помощи синтаксиса индексеров:

// до
excel.get_Range("A1").set_Value(Type.Missing, "ID");

// после
excel.Range["A1"].Value = "ID";

Объявлять самим из C# нельзя, только вызывать COM, VB и пр. Детали здесь:
http://blogs.msdn.com/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx
Re[7]: [ANN] C# 4.0 Indexed Properties
От: Пельмешко Россия blog
Дата: 21.10.09 18:13
Оценка: 108 (4)
Здравствуйте, Кирилл Осенков, Вы писали:

КО>А что, больше к дизайну VB как к языку претензий нет?


Это всё фигня по сравнению с разгильдяйством F# в плане свойств:
namespace FooBar

[<System.Reflection.DefaultMemberAttribute("DefaultIndexer")>]
type Foo =
    
    new(value : int) = { x = value }
    val mutable x : int
    
    member this.Magic (* different accessor types *)
      with get () : int = this.x
      and  set (s : string) = printfn "%s" s
    
    member this.DefaultIndexer
      with get (index : int) = this.x
      and  set (index : int) (x : int) = ()
      
    member this.NamedIndexer
      with get (index : int) = this.x
      and  set (index : int) (x : int) = ()

C# одуревает от таких свойств, R# не может заменить var на явную аннотацию типа
var x = foo.Magic;
// Property, indexer, or event 'Magic' is not supported by the language;
// try directly calling accessor methods 'FooBar.Foo.get_Magic()' or 'FooBar.Foo.set_Magic(string)'
Вдруг type inference обманет и потом из C# юзать так придётся:
int x = foo.get_Magic();
foo.set_Magic("sdsd");
Ума не приложу почему не проверяется идентичность типов акцессоров

Не DefaultMember-индексеры можно вызвать явно...
foo.get_NamedIndexer(3);
foo.set_NamedIndexer(3, 4);

А свойства с более, чем одним аргументом определить в F# нельзя...
Re[4]: [ANN] C# 4.0 Indexed Properties
От: Мишень-сан  
Дата: 21.10.09 08:13
Оценка: +3
Здравствуйте, Кирилл Осенков, Вы писали:

Как-то пропустил этот кусочек сначала.
Хотя в том же VB.NET индексные свойства не мешают.
ИМХО, иногда проще был бы именованный индексер, чем плодить лишние классы.
Re[5]: [ANN] C# 4.0 Indexed Properties
От: Lloyd Россия  
Дата: 21.10.09 16:22
Оценка: +1 :))
Здравствуйте, gecko, Вы писали:

G>Тогда возникает другой вопрос: а зачем было в Бейсике это вводить? Почему там не нужно "separate the responsibilities", а в C# нужно?


Соместимость с 6-м VB?
Re[3]: [ANN] C# 4.0 Indexed Properties
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.10.09 19:56
Оценка: 20 (2)
Здравствуйте, Кирилл Осенков, Вы писали:

OG>>А если в VB.NET объявить свойство с параметрами, то из C# его нельзя вызвать таким образом, как я понимаю. Так?


КО>Почему же. Можно. Отчасти для этого фичу и сделали.


У меня свойства из COM вызываются, а из VB.NET — не вызываются. Покажи код, как можно определить свойство с параметрами в VB.NET и вызвать его из C# 4.0.
Re[4]: [ANN] C# 4.0 Indexed Properties
От: Кирилл Осенков Украина
Дата: 27.10.09 01:13
Оценка: 22 (1)
OG>>>А если в VB.NET объявить свойство с параметрами, то из C# его нельзя вызвать таким образом, как я понимаю. Так?

КО>>Почему же. Можно. Отчасти для этого фичу и сделали.


N>У меня свойства из COM вызываются, а из VB.NET — не вызываются. Покажи код, как можно определить свойство с параметрами в VB.NET и вызвать его из C# 4.0.


В общем, я оплошал. Сорри за дезинформацию Мы действительно только поддерживаем свойства, объявленные в COM. Схитрить можно, поставив атрибут <ComImport> _ в VB, но эта лазейка не рекомендуется.

Рассказываю детали.

Когда фичу писали (это было в мае 2009), стало понятно, что добавить полноценную поддержку вызова свойств из VB и пр. очень рискованно, т.к. не успеем всё оттестировать. В VB фазовое пространство возможных свойств несравнимо больше чем тех, которые могут быть объявлены через COM. Например, в COM всё public, а в VB можно объявить protected internal setter, и пр. и пр. Так что приняли осознанное решение делать фичу только для COM и поддержку VB явно закрыли (потребовав [ComImport] на импортируемом свойстве). Фича планировалась как DCR (т.е. last-minute обновление небольшого масштаба), поэтому урезали как могли. Бюджет тоже был так себе (три недели двух тестеров), плюс три недели 2-х девелоперов (compiler + IDE). Сейчас пишу и кажется, что это много, ан нет, это на самом деле очень мало. Написать автоматизацию плюс тесты, плюс всё ручное тестирование и пр. И так с трудом успели.

В общем не знаю, годится ли это как оправдание, но что есть, то есть Я запутался, потому что сначала поддержка VB была, и я её тестировал, но потом мы её закрыли, а когда я писал блог, то про это забыл

А что, это сильно надо? Если много народу ругаться будут, может имеет смысл suggestion открыть для Dev11?
Re[2]: [ANN] C# 4.0 Indexed Properties
От: Кирилл Осенков Украина
Дата: 21.10.09 07:31
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>Зачем?


Ну код не такой уродливый получается. get_ и set_ как-то криво смотрятся. Value2 опять же. Уродство.
Re[3]: [ANN] C# 4.0 Indexed Properties
От: _FRED_ Черногория
Дата: 21.10.09 08:02
Оценка: :)
Здравствуйте, Кирилл Осенков, Вы писали:

_FR>>Это [сабж] был большущий такой облом :о))


КО>А чё? Не понял


Увидел сабж — подумал, теперь "Объявлять самим из C#" можно. Прочитал сообщение — нет, нельзя :о))
Help will always be given at Hogwarts to those who ask for it.
Re[3]: [ANN] C# 4.0 Indexed Properties
От: Lloyd Россия  
Дата: 21.10.09 09:33
Оценка: :)
Здравствуйте, Pro100Oleh, Вы писали:

Q>>Зачем?


PO>Поддерживаю. Действительно, зачем? Раньше как-то обходился. То, что некоторые удобства есть я не спорю, но теперь будут возникать путаницы — в каком классе реализован индексатор:


Т.к. поскипанный код нельзя объявить в шарпе, то и путаницы никакой не должно быть.
Re[4]: [ANN] C# 4.0 Indexed Properties
От: gecko  
Дата: 21.10.09 11:51
Оценка: +1
Здравствуйте, Кирилл Осенков, Вы писали:

КО>

Why not allow declaring indexed properties in C#?

КО>A common question that we expect we’ll be getting is “why just consume? why not allow to declare such properties in C#?”. Well, the answer is not even that we first have to cost, design, spec, prototype, implement and test this feature, but rather that we think that declaring a type with an indexer is a preferred approach. It’s useful to separate the responsibilities:

КО>

  • The property is there to get an object. The property belongs to the parent object.
    КО>
  • The indexer is there on the returned object to enumerate it. The indexer belongs to the returned object.
    КО>We shouldn’t be mixing these together.


  • Тогда возникает другой вопрос: а зачем было в Бейсике это вводить? Почему там не нужно "separate the responsibilities", а в C# нужно?
    Re[3]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 27.10.09 01:19
    Оценка: :)
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Почему же. Можно. Отчасти для этого фичу и сделали.


    Поставьте мне минусов кто-нибудь А то стыдно
    Re: [ANN] C# 4.0 Indexed Properties
    От: Мишень-сан  
    Дата: 21.10.09 07:14
    Оценка:
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Мы в Beta 2 добавили новую фичу в язык: теперь можно вызывать свойства с параметрами при помощи синтаксиса индексеров:


    Возникает резонный вопрос.
    А почему бы не добавить полноценную поддержку?
    Re: [ANN] C# 4.0 Indexed Properties
    От: _FRED_ Черногория
    Дата: 21.10.09 07:16
    Оценка:
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Мы в Beta 2 добавили новую фичу в язык: теперь можно вызывать свойства с параметрами при помощи синтаксиса индексеров:


    Это [сабж] был большущий такой облом :о))
    Help will always be given at Hogwarts to those who ask for it.
    Re[2]: [ANN] C# 4.0 Indexed Properties
    От: Мишень-сан  
    Дата: 21.10.09 07:16
    Оценка:
    Имелось ввиду добавление возможности не только вызова, но и объявления собственных индексных свойств.
    Re: [ANN] C# 4.0 Indexed Properties
    От: Qbit86 Кипр
    Дата: 21.10.09 07:21
    Оценка:
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Мы в Beta 2 добавили новую фичу в язык...


    Зачем?
    Глаза у меня добрые, но рубашка — смирительная!
    Re[3]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 21.10.09 07:30
    Оценка:
    Здравствуйте, Мишень-сан, Вы писали:

    МС>Имелось ввиду добавление возможности не только вызова, но и объявления собственных индексных свойств.


    Прошу прощения, что по-аглицки:

    Why not allow declaring indexed properties in C#?

    A common question that we expect we’ll be getting is “why just consume? why not allow to declare such properties in C#?”. Well, the answer is not even that we first have to cost, design, spec, prototype, implement and test this feature, but rather that we think that declaring a type with an indexer is a preferred approach. It’s useful to separate the responsibilities:

  • The property is there to get an object. The property belongs to the parent object.
  • The indexer is there on the returned object to enumerate it. The indexer belongs to the returned object.
    We shouldn’t be mixing these together.

  • Re[2]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 21.10.09 07:30
    Оценка:
    Здравствуйте, _FRED_, Вы писали:

    _FR>Это [сабж] был большущий такой облом :о))


    А чё? Не понял
    Re: [ANN] C# 4.0 Indexed Properties
    От: Oksana Gimmel http://oksana-gimmel.blogspot.com/
    Дата: 21.10.09 09:27
    Оценка:
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Мы в Beta 2 добавили новую фичу в язык: теперь можно вызывать свойства с параметрами при помощи синтаксиса индексеров:


    КО>
    КО>// до
    КО>excel.get_Range("A1").set_Value(Type.Missing, "ID");
    
    КО>// после
    КО>excel.Range["A1"].Value = "ID";
    КО>


    А если excel будет иметь тип dynamic, это будет работать?
    asato ma sad gamaya
    Re[2]: [ANN] C# 4.0 Indexed Properties
    От: Pro100Oleh Украина  
    Дата: 21.10.09 09:27
    Оценка:
    Здравствуйте, Qbit86, Вы писали:

    Q>Здравствуйте, Кирилл Осенков, Вы писали:


    КО>>Мы в Beta 2 добавили новую фичу в язык...


    Q>Зачем?


    Поддерживаю. Действительно, зачем? Раньше как-то обходился. То, что некоторые удобства есть я не спорю, но теперь будут возникать путаницы — в каком классе реализован индексатор:

    class MyRange
    {
      public int this[int index]
      {
        get {return 0;}
      }
    }
    
    class Excel
    {
      public MyRange MyRange {get;set;}
      public int Range[int index] //типа новая фича
    }
    
    ........
    
    Excel excel = CreateExcel(...);
    int a = excel.Range[13];
    int b = excel.MyRange[13];


    ЗЫ: я так понял, что это лишь фича языка C#, а реализуется все теми же индексаторами (или свойствами с параметрами, как они еще описаны у Рихтера).
    Pro
    Re[2]: [ANN] C# 4.0 Indexed Properties
    От: _FRED_ Черногория
    Дата: 21.10.09 09:45
    Оценка:
    Здравствуйте, Oksana Gimmel, Вы писали:

    КО>>Мы в Beta 2 добавили новую фичу в язык: теперь можно вызывать свойства с параметрами при помощи синтаксиса индексеров:

    КО>>// до
    КО>>excel.get_Range("A1").set_Value(Type.Missing, "ID");
    
    КО>>// после
    КО>>excel.Range["A1"].Value = "ID";

    OG>А если excel будет иметь тип dynamic, это будет работать?

    Работает:

          var app = new Microsoft.Office.Interop.Excel.Application();
          dynamic book = app.Workbooks.Add();
          dynamic sheet = book.Worksheets.Add();
          sheet.Range["A2"] = "Test!";
          book.SaveAs(@"C:\Temp\Test2.xls");
          book.Close();
          app.Quit();
    Help will always be given at Hogwarts to those who ask for it.
    Re[4]: [ANN] C# 4.0 Indexed Properties
    От: Pro100Oleh Украина  
    Дата: 21.10.09 10:56
    Оценка:
    Здравствуйте, Lloyd, Вы писали:

    L>Здравствуйте, Pro100Oleh, Вы писали:


    Q>>>Зачем?


    PO>>Поддерживаю. Действительно, зачем? Раньше как-то обходился. То, что некоторые удобства есть я не спорю, но теперь будут возникать путаницы — в каком классе реализован индексатор:


    L>Т.к. поскипанный код нельзя объявить в шарпе, то и путаницы никакой не должно быть.


    Путаница возникает при использовании (вторая часть приведенного мною кода), а не при обявлении кода. А объявить можно и не в шарпе.
    Pro
    Re[5]: [ANN] C# 4.0 Indexed Properties
    От: Пельмешко Россия blog
    Дата: 21.10.09 15:49
    Оценка:
    Здравствуйте, gecko, Вы писали:

    G>Тогда возникает другой вопрос: а зачем было в Бейсике это вводить? Почему там не нужно "separate the responsibilities", а в C# нужно?


    Ну наверное уж для COM, зачем же ещё.
    С появления dynamic и "улучшенной поддержки COM в C# 4.0" оное и в C# стало иметь смысл.

    Я думаю вопрос должен быть такой: зачем было в VB.NET вводить возможность самому определять такие свойства?
    Re[6]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 21.10.09 17:06
    Оценка:
    Здравствуйте, Пельмешко, Вы писали:

    П>Я думаю вопрос должен быть такой: зачем было в VB.NET вводить возможность самому определять такие свойства?


    А что, больше к дизайну VB как к языку претензий нет?

    По историческим причинам. Если бы ВБ с нуля дизайнили, то там вместо default properties и indexed properties тоже бы indexers и implicit conversion были бы.
    Re: [ANN] C# 4.0 Indexed Properties
    От: Oksana Gimmel http://oksana-gimmel.blogspot.com/
    Дата: 22.10.09 09:08
    Оценка:
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Объявлять самим из C# нельзя, только вызывать COM, VB и пр. Детали здесь:

    КО>http://blogs.msdn.com/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx

    А если в VB.NET объявить свойство с параметрами, то из C# его нельзя вызвать таким образом, как я понимаю. Так?
    asato ma sad gamaya
    Re[3]: [ANN] C# 4.0 Indexed Properties
    От: nikov США http://www.linkedin.com/in/nikov
    Дата: 22.10.09 10:11
    Оценка:
    Здравствуйте, Кирилл Осенков, Вы писали:

    КО>Value2 опять же. Уродство.


    А откуда вообще бралось Value2?
    Re[5]: [ANN] C# 4.0 Indexed Properties
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.10.09 16:59
    Оценка:
    Здравствуйте, Мишень-сан, Вы писали:

    МС>Как-то пропустил этот кусочек сначала.

    МС>Хотя в том же VB.NET индексные свойства не мешают.
    МС>ИМХО, иногда проще был бы именованный индексер, чем плодить лишние классы.

    Не только в Бэйсике. В Немерле тоже поддерживаются и проблем не вызывают.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 22.10.09 18:51
    Оценка:
    Здравствуйте, Пельмешко, Вы писали:

    П>Это всё фигня по сравнению с разгильдяйством F# в плане свойств:


    Спасибо! Разбираемся!

    From: Chris Smith (F#)
    To: Kirill Osenkov
    Subject: RE: Weirdness with F# properties


    Kirill,

    Your friend has stumbled upon some interesting bugs / corner cases in both the C# and F# compilers.

    1. It sounds legit that the C# compiler won’t allow you to use properties that have different getter and setter types. Just like the error message says you can work around this.
    2. To create a default indexer in F#, simply create a property named Item. However, that doesn’t work in the code example because they explicitly added a DefaultMemberAttribute, it looks like in that case the F# compiler adds that attribute twice which leads to problems.
    3. You can have properties that take more than one parameter, just tuple them. E.g. (index : int * int * int) or (x, y, z)

    I’m going to continue investigating here, but tell your friend good job for poking around in the corners 

    -Chris

    Re[2]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 22.10.09 18:53
    Оценка:
    Здравствуйте, Oksana Gimmel, Вы писали:

    OG>А если в VB.NET объявить свойство с параметрами, то из C# его нельзя вызвать таким образом, как я понимаю. Так?


    Почему же. Можно. Отчасти для этого фичу и сделали.
    Re[4]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 22.10.09 18:55
    Оценка:
    Здравствуйте, nikov, Вы писали:

    N>А откуда вообще бралось Value2?


    У меня такое впечатление, что это они сделали shortcut для вызова get_Value() без параметров.
    Re[4]: [ANN] C# 4.0 Indexed Properties
    От: Кирилл Осенков Украина
    Дата: 24.10.09 23:07
    Оценка:
    Здравствуйте, nikov, Вы писали:

    N>У меня свойства из COM вызываются, а из VB.NET — не вызываются. Покажи код, как можно определить свойство с параметрами в VB.NET и вызвать его из C# 4.0.


    Обана. Интересно. Если на VB тип, который определяет свойство, положить ComImport, то всё работает. Без него — не работает! В понедельник приду на работу, будем разбираться... В любом случае спасибо, что обратили моё внимание

    Вот так работает:
    Imports System.Runtime.InteropServices
    
    <ComImport()> _
    Public Class Class1
    
        Public Property IndexProp(ByVal p1 As Integer) As String
            Get
                Return Nothing
            End Get
            Set(ByVal value As String)
    
            End Set
        End Property
    End Class
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.