C# - Keyword 'this' Not Available Calling The Base Constructor?
Mar 15, 2010
In the inherited class I use the base constructor, but I can't use the class's members calling this base constructor. In this example I have a PicturedLabel that knows its own color and has an image. A TypedLabel : PictureLabel knows its type but uses the base color.
The (base) image that uses TypedLabel should be colored with the (base)color, however, I can't obtain this color
Error: Keyword 'this' is not available in the current context`
I have a base class that contains a fairly large number of parameters in it's New constructor. I have 7 subclasses that inherit the Super base class. My question/issue is, all of the subclasses use the same values for most of the parameters in the New constructor of the base class and these subclasses can be called one after the other. I would like to populate the common values for the superclass and then use those for each of the subclasses, but I can't come up with a good way to do this. If I could figure out how to do this, I wouldn't have to pass all of those parameters in the MyBase.New call for each subclass. I'll try to illustrate with some code .
comparing C# code and VB.NET and the results between the seemingly identical code were entirely different.(Why C# is always winning over VB.NET?)The explanation given is that C# will initialize the class fields, then call the base constructor, but VB.NET does the exact opposite. Is there a technical reason for the languages to be different? At first glance, it seems that either approach is equally valid, but I can't fathom why they wouldn't have selected the SAME approach.
EDIT: As 'Jeffrey L Whitledge' has pointed out, VB6 did not have inheritance, so I don't think we can say 'to keep VB.NET and VB6 more closely related'.
After debugging a particularly tricky issue in VB.NET involving the order in which instance variables are initialized, I discovered that there is a breaking discrepancy between the behavior that I expected from C# and the actual behavior in VB.NET.Nota bene: This question concerns a slight discrepancy in the behaviors of VB.NET and C#. If you're a language bigot that is unable to provide an answer other than "that's why you should use C#, noob", there is nothing for you to see here; kindly move along.Specifically, I expected the behavior outlined by the C# Language Specification (emphasis added):
When an instance constructor has no constructor initializer, or it has a constructor initializer of the form base(...), that constructor implicitly performs the initializations specified by the variable-initializers of the instance fields declared in its class. This corresponds to a sequence of assignments that are executed immediately upon entry to the constructor and before the implicit invocation of the direct base class constructor. The variable initializers are executed in the textual order in which they appear in the class declaration.
Contrast that with the portion of the VB.NET Language Specification concerning Instance Constructors, which says (emphasis added): When a constructor's first statement is of the form MyBase.New(...), the constructor implicitly performs the initializations specified by the variable initializers of the instance variables declared in the type. This corresponds to a sequence of assignments that are executed immediately after invoking the direct base type constructor. Such ordering ensures that all base instance variables are initialized by their variable initializers before any statements that have access to the instance are executed.
The discrepancy here is immediately obvious. C# initializes class-level variables before calling the base constructor. VB.NET does exactly the reverse, apparently preferring to call the base constructor before setting the values of instance fields.If you want to see some code, this related question provides a more concrete example of the divergent behavior. Unfortunately, it does not provide any hints as to how one might coerce VB.NET into following the model established by C#.
I'm less interested in why the designers of the two languages chose such divergent approaches than I am in possible workarounds for the problem. Ultimately, my question is as follows: Is there any way that I can write or structure my code in VB.NET to force instance variables to be initialized before the base type's constructor is called, as is the standard behavior in C#?
I'm not sure if this is possible or not. I have a number of different classes that implement interface IBar, and have constructors that take a couple of values. Rather than create a bunch of almost identical method, is it possible to have a generic method that will create the appropriate constructor?
private function GetFoo(Of T)(byval p1, byval p2) as List(Of IBar) dim list as new List(Of IBar) dim foo as T ' a loop here for different values of x foo = new T(x,p1) list.Add(foo) ' end of loop return list end function
I get: 'New' cannot be used on a type parameter that does not have a 'New' constraint.
I have a MDI app that I am creating. It, of course, will have multiple MDI child forms. In each child form, I have an options button so that each child form can have it's own set of options. When I click the options button it opens an Options form. This options form is not an MDIChild.
I have a class that contains the child forms options. I pass this class to the options form using a constructor. This is how I call the options form:
Dim dlgPatternOptions As dlgOptions = New dlgOptions(thisPatternOptions) thisPatternOptions is the class that I am passing to the Options Form.
This works fine and the options form does populate the options correctly. The Options form constructor is this:
Public Sub New(ByRef thePatternOptions As CanvasOptions) Me.InitializeComponent() Me.txtCanvasWidth.Text = thePatternOptions.CanvasWidth.ToString Me.txtCanvasHeight.Text = thePatternOptions.CanvasWidth.ToString End Sub
I change the options in the options form. How can I get those changes back to the calling form? Do I need to somehow pass a handle of the calling form to the constructor to get the changed values back to the calling form? Is there some way to pass a handle to the options form so that changes made to options will be pushed back to the calling form?
Use the "new" keyword to create an object instance & Check to determine if the object is null before calling the method. I'm reading text from a text file using the following [Code]
Given in the following language specification, for me at least, calling Db.Foobar() [In the following code] does not indeed call off to the Shared Constructors of the base classes. I am curious as to a) is this my own fault for doing something wrong or b) is this an error in the language specification[code]...
I have an abstract class which requires a delegate to function. I pass the delegate into the constructor. Now that I have a non default constructor I need to call the abstract class's constructors from the concrete class which means that I need to use MyBase.New(...). I have included a quick example below.
Public MustInherit Class BaseClass Public Delegate Sub WorkMethod() Private _Work As WorkMethod
[code]....
I have tried to do this but I keep getting the following error: "Implicit reference to object under construction is not valid when calling another constructor".Can I not do what I am trying to do above? I initially had the delegate setup in its own setter method. But then I am creating a deceptive API because it does require a point to a method to work properly.
what's the rationale behind this limitation: Constructor call is valid only as the first statement in an instance constructor i want to pass an argument to my constructor which validates this argument and calls mybase.new according to this argument but it doesn't let me
example:
Public Class prob Inherits System.ApplicationException Public Sub New(ByVal problem As String, ByRef inner_exception As Exception)
I am getting following error when I am trying to use Convert.FromBase64String "The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters."
Dim payloadBytes = Convert.FromBase64String(payloadBase64)
Basically when my facebook registration form [URL]mphone field has a dash in it and encoded string is posted to other page and I am trying to decode it there which creates this error. Basically I am trying to extract data from Facebook Signed Request.
I can quickly knock together soem code to xlate base 10 to/from bae 13, but I just wondered if something very easy already exists in VB.NET (or even somethign generic, with base N, but right now I am only looking at base 13)
I'm retrieving data from Excel and would like to keep my arrays 0 based but Excel returns 1 base. Is there a fairly simple way to return change the array from 1 to 0 base? Or do I just need to create a loop? Here's an example code right here:
A project has a class (CAR Class) with the folloiwng details and the CARADMIN cLASS with the following details: The cardAdmin class has 2 constructor Public Sub New() & Public Sub New(ByVal rec As Rectangle) I dont know how to code the latter constructor..
cAR Class has this method/properties:
Public Class Car Inherits HVSprite Private fSoundFile As String
I have a defualt constructor that has a object of a Database connectivity class:[code]therefore in theory i have to call the defualt constructor of Question from overloaded constructor. [code]How every in realitty is it possible to call the defautl constructor from the overloaded constructor
I am rewriting a C# class in VB. The C# class has a static constructor in it:
static Class() { ... }
which, through the Call Stack, I found is called by the main window's InitializeComponent() method.Everywhere I've looked has told me that the corresponding static constructor in VB is just:Shared Sub New()
but this method is never invoked. Am I creating my VB static constructor right? Is it likely something else that has nothing to do with my static constructor?
Protected Sub Menu1_MenuItemClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MenuEventArgs) Handles Menu1.MenuItemClick End Sub
In VB.net, we have the Handles keyword, I'm wondering if C# has anything comparable. Or do you have to manually wire all the methods to each control's event (in ASP.NET especially)?
Possible Duplicate:Default value for generics k so while translating some code from c# to vb, i came across the default keyword, and I'm simply replacing it to nothing.
In my current project everyone names variables and methods after what they are and what they do. This is good for quickly understanding the code, but with a lot of long varible names comes some headaches, such as when copying a dataset to an entity/object. So, while you understand the code, the readability still takes a blow.
veryLongVariableName.Id = datasetVeryLongVariableName.Id veryLongVariablename.Something = datasetVeryLongVariableName.Something etc.
Using VB.NET's With keyword can help.
With veryLongVariableName .Id = datasetVeryLongVariableName.Id .Something = datasetVeryLongVariableName.Something End With
Now, my question, is there any way of using With, or something similar, but for several variables at the same time? Something like:
With veryLongVariableName As a, datasetVeryLongVariableName as b a.Id = b.Id a.Something = b.Something End With
I'm all for descriptive naming conventions, but they do tend to clutter things. Especially in VB!
I m trying to create a software in vb.net for some genealogists to trace their ancestors History, the users will search for the document in 3 ways
1. reference number from a combo box. 2. By the title of the document. 3. by inserting a keyword from the documents abstract..
i have already loaded the picture. i hav put all in one note pad my reference no., on next line i put my abstract and on the third line i put my path where the document is located.in coding i put all in different array.... making the program read all one by one line wise.i want to make search thru the keyword... means wen user inserts a key word in the textbox the program read all my abstract and then in a drop down it should display the documents that match the keyword.
Its work well in windows 7 but when i run project in windows xp its says i must use New keyword but when i use New its gives error at regkey.GetValueNames and RegistryKey = Registry.LocalMachine and regBaseKey.OpenSubKey("SOFTWAREMyApp", FalseImports Microsoft.Win32[code]...