2011-12-21 15 views
8

ho avuto qualcosa di strano in VB.NET, mai notato prima ...proprietà con il parametro

Ho una classe in VB.NET avere una proprietà con il parametro e voglio usare quella proprietà in altri Classe C facendo oggetto di classe VB.NET ma oggetto di classe che non mostra quella proprietà, potrebbe qualcuno dirmi se posso accedere a quella proprietà in C# oppure no.

  • Se sì, come?
  • Se no, cosa significa CLR?

Ecco il mio codice ...

Public Property AsString(ByVal name As String) As String 
    Get 
      //Some code 
    End Get 
    Set(ByVal value As String) 
      //Some code 
    End Set 
End Property 

Nota: Non posso cambiare il codice VB.NET come viene compilato DLL.

Grazie in anticipo

+0

che cosa si intende per una proprietà con parametro? –

+1

Perché parli di [CLR] (http://en.wikipedia.org/wiki/Common_Language_Runtime)? –

+0

So che questo è 4 anni dopo, ma non ho dovuto farlo fino ad ora. Quindi è ancora il caso che C# non supporta proprietà che hanno parametri? L'ho visto in VB, ma non l'ho mai visto in C#. Presumo che la risposta sia sì, C# non lo supporta. Voglio solo verificarlo. – Rod

risposta

10

proprietà parametrizzate vengono convertiti in get_ e set_ metodi.

string name = "Foo"; 
string value = "Bar"; 
MyObject.set_AsString(name, value); 
string fooValue = MyObject.get_AsString(name); 
+0

Oh! vi voglio bene ragazzi!! grazie mille ... – ANKIT

6

C# non supporta le proprietà indicizzate che non hanno la parola chiave Default. È semplice utilizzare get_AsString() per chiamare la proprietà getter e set_AsString() per chiamare il setter. Metodi, non proprietà. Dovrebbero essere facilmente visualizzati nell'elenco IntelliSense.

Si noti inoltre che set_AsString() richiede due argomenti anche se il setter della proprietà non è stato indicizzato. Passa qualsiasi cosa, null lo farà.

Fwiw, questo è forse un esempio del perché il team C# ha deciso di non supportare le proprietà indicizzate nel caso generale. La discrepanza tra il getter e il setter è dolorosa. Il team di vb.net non ha avuto scelta, Visual Basic li ha avuti molto tempo prima che .NET venisse fuori. Ha fatto un ritorno parziale in C# versione 4 anche se, le proprietà indicizzate sono supportate su interfacce COM. La programmazione di interoperabilità COM è troppo dolorosa senza di loro. In particolare nel modello a oggetti di Office.

+0

Di quale "disadattamento" stai parlando? Il setter della proprietà è indicizzato; la "lista parametri" per il setter include solo il valore, perché è l'unica cosa che non è stata specificata nella definizione della proprietà stessa.Ci può essere una leggera ambiguità apparente se una proprietà indicizzata e non indicizzata ha lo stesso nome, e il tipo della proprietà non indicizzata ha un indicizzatore predefinito, ma in realtà non c'è ambiguità: 'thing.prop (x)' legherà a una proprietà indicizzata adatta se ne esiste una; se si vuole usare quello non indicizzato e indicizzare il risultato, si può usare '(thing.prop) (x)'. – supercat

+0

Una cosa del genere potrebbe essere utile se ne avessi, ad es. un dizionario che ha mantenuto le chiavi e i valori nell'ordine in cui sono stati aggiunti e ha consentito l'accesso a chiavi o valori tramite indice numerico, oltre a consentire l'accesso ai valori tramite i tasti. 'MyDict.Keys (2)' sarebbe la terza chiave aggiunta e 'MyDict.Values ​​(2)' sarebbe il suo valore corrispondente. Si potrebbero ottenere risultati simili avendo 'MyDict.Keys' e' MyDict.Values' ognuno restituisca una struct che conteneva un riferimento al dizionario e aveva un indicizzatore che chiamerebbe una funzione adatta su quel dizionario, ma che sarebbe più ickier. – supercat

+0

Se lo hanno fatto come in C++/CLI e hanno imposto che getter e setter debbano definire e utilizzare gli stessi parametri, non dovrebbe esserci alcuna confusione: 'stringa pubblica Fonte [int i_ixSource] {get (int i_ixSource) {. ..} set (int i_ixSource) {...}} 'Attualmente è un grosso rompicapo per me lavorare intorno a dozzine di proprietà parametrizzate che ho implementato nel mio codice C++/CLI durante la conversione in C#. –

0

Se u hanno notato in realtà ci sono due parametri nella vostra proprietà è il vostro di nome e altro è il valore predefinito in modo u deve dare due valore del parametro quando u lavoro con quello

Problemi correlati