Oggetti implicitamente istanziati in vb.net?

Sto mantenendo un’applicazione con componenti VB.NET e c #. Ho pensato che queste due lingue differissero solo nella syntax, ma ho trovato una strana funzionalità in VB.NET che non è presente in C #.

In VB.NET, ho la seguente class:

Public Class bill_staff Inherits System.Windows.Forms.Form .... End Class 

Se voglio usare questa class in C #, faccio questo:

 using (var frm = new bill_staff()) frm.ShowDialog(); 

Tuttavia, nel codice VB.NET, la class può essere utilizzata in questo modo:

 bill_staff.ShowDialog(); 

ShowDialog è definito nei metadati come questo:

 Public Function ShowDialog() As System.Windows.Forms.DialogResult 

Quindi, in VB.NET, è ansible chiamare un metodo di istanza sulla class. Per quanto posso dire, questo sembra implicitamente creare una nuova istanza della class, e quindi chiama il metodo su quell’object. In C #, questo non è ansible: i metodi statici devono essere chiamati sulla class e i metodi di istanza devono essere richiamati sugli oggetti.

Non riesco a trovare alcuna informazione su questo su Internet. Qual è la funzione chiamata, ed è una buona pratica?

Inizialmente il progetto è stato convertito da VB6 – si tratta di una strana caratteristica legacy?

Sì, questo è un comportamento legacy. Le classi non Form1.Show mostrate in VB fino alla v4, prima che Form1.Show fosse il modo di mostrare i moduli. Per mantenere compatibile il codice precedente (anche VB3 era molto popolare), il vecchio metodo è stato mantenuto.

È ancora supportato in .NET come mezzo legale per mostrare i moduli. Inizialmente, questo è stato aggiunto per semplificare la migrazione del codice VB6 a VB.NET. Ma è anche lì per rendere più facile ottenere qualcosa in esecuzione in VB – MS si riferisce ad esso come funzionalità a portata di mano e frasi simili.

Fondamentalmente, fornisce allo spaccone un modo semplice per programmare senza comprendere oggetti e OOP. Immagina le domande che avremmo qui se Form1.Show avesse Form1.Show un errore.

L’istanziamento esplicito è il metodo migliore perché è orientato agli oggetti e rende meno probabile che il codice faccia riferimento o crei un nuovo Form2 quando si desidera effettivamente utilizzare un’istanza esistente.

Per i moduli, VB crea un’istanza predefinita per te dietro le quinte. ad esempio, il seguente VB:

 Public Class bill_staff Inherits System.Windows.Forms.Form End Class class testclass sub testmethod() bill_staff.Show() end sub end class 

è equivalente al seguente C #:

 public class bill_staff : System.Windows.Forms.Form { private static bill_staff _DefaultInstance; public static bill_staff DefaultInstance { get { if (_DefaultInstance == null) _DefaultInstance = new bill_staff(); return _DefaultInstance; } } } internal class testclass { public void testmethod() { bill_staff.DefaultInstance.Show(); } } 

Ciò si verifica solo in VB per i moduli (classi che ereditano da System.Windows.Forms.Form). Personalmente, penso che questa sia una “caratteristica” terribile di VB – confonde la distinzione tra class e istanza.