Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Default properties in VB.NET?

Tags:

.net

oop

vb.net

In the early days of .NET, I believe there was an attribute you could decorate a class with to specify a default property.

According to some articles I've found, this appears to have been yanked from the framework at some point, because it was a little confusing, and I can see how that is the case.

Still, is there another way to get the functionality it provided?

It looked something like this:

<DefaultProperty("Value")> _   Public Class GenericStat     ...     Public Property Value() As Integer         ...     End Property     ... End Class 

This allowed you to do Response.Write(MyObject) instead of Response.Write(MyObject.Value)... This is not a terribly clunky example, but in some complex object-oriented contexts it gets a little hideous. Please let me know if there is a better way.

Note: I am not looking for the Default keyword, which can only be used on properties that take a parameter.

like image 926
Brian MacKay Avatar asked Nov 15 '08 23:11

Brian MacKay


People also ask

What are properties in VB net?

A property is a value or characteristic held by a Visual Basic object, such as Caption or Fore Color. Properties can be set at design time by using the Properties window or at run time by using statements in the program code. Object. Property = Value.

What is the default property of Data Control in VB?

Caption is the Default Property.

How many default controls are available in VB?

The three basic VB controls are the Label, Textbox, and Button; these are the controls we will be working with for this program.

Which function get the default properties of the class?

ReflectionClass::getDefaultProperties Gets default properties from a class (including inherited properties). Note: This method only works for static properties when used on internal classes. The default value of a static class property can not be tracked when using this method on user defined classes.


1 Answers

Well, the .NET framework does have a notion of a default member. Key ingredients are the DefaultMemberAttribute class and Type.GetDefaultMembers(). In VB.NET, specifying the default member is part of the language syntax:

  Public Class Sample     Private mValue As Integer     Default Public ReadOnly Property Test(ByVal index As Integer) As Integer       Get         Return index       End Get     End Property   End Class 

Use it like this:

  Sub Main()     Dim s As New Sample     Console.WriteLine(s(42))     Console.ReadLine()   End Sub 

The compiler implements this by emitting [DefaultMember] automatically. This however has a restriction, the property must have an index argument, specifically to avoid the syntax ambiguity. This restriction is not enforced when specifying the attribute explicitly:

  <System.Reflection.DefaultMember("AnotherTest")> _   Public Class Sample     Public ReadOnly Property AnotherTest() As Integer       Get         Return 42       End Get     End Property   End Class 

But that default member would only be accessible as a default by a language that allows such syntax. For which I don't know an example in .NET, this was used back in the COM days, like VB6. Also the core reason behind VB6 having the Set keyword, it solves the ambiguity and states "I mean the object, not the object's default property". Very painful syntax detail for many beginning Visual Basic programmers back then.

C# has the exact same rules, but doesn't allow the same kind of flexibility. You've probably seen the indexer before:

  public class Sample {     public int this[int index] {       get { return index; }     }   } 

This code also makes the compiler output the [DefaultMember] attribute. The named property in that attribute is "Item". And that's why you see the indexer documented and indexed in the MSDN Library as "Item".

like image 120
Hans Passant Avatar answered Sep 28 '22 03:09

Hans Passant