2016-09-07 11 views
0

私はこのように見えたSubを見てきました:なぜvb.netはクラス名をパラメータ名にすることができますか?

Private Sub DoSomething(ByRef PlaceHolder As PlaceHolder) 
    'Do something with the PlaceHolder object 
End Sub 

これが許可されている理由は、私は疑問に思います。私はこれが許されないところでいくつかの言語を挙げることができます。私は非常に同じ戻り値、パラメータと名前を持つメソッドを持つことができるようにしたいと考えています。そのうちの1つがSharedで、もう1つがインスタンスレベルです。例えば

、私たちはBirdという名前Classがあるとする場合は、この

Dim bird = New Bird("Duck Doggers") 

bird.fly()のような物体が、しかし、Bird.fly()は、すべての鳥が飛ぶになるだろう、ダックDoggersが飛ぶことを確認してくださいだろうがあるとしましょう例えば、IEnumerableは、各コンストラクタの実行時にBirdおよびBird.flyに更新され、IEnumerableを反復し、各項目に対してflyとコールします。限り、私は見ることができます、これはvb.netで不可能です、フライはSharedまたはインスタンスレベルのいずれかになるでしょう。パラメータ名が、そのインスタンスが上記のパラメータであるClassの名前とまったく同じであれば、(unclarity以外に)問題はありますか?

私の前にC#はありませんが、パラメータの名前を正確にClassとすることが可能かどうかは疑問です。

+4

から呼び出されます。静的メソッドとインスタンスメソッドに同じ名前を使用することは、パラメータ名とは関係なく、とにかく醜いデザインです。すべてのインスタンスを見つけるために 'fly()'はどこに行きますか?リストを使用してすべてのインスタンスを格納するだけで、メモリリークが保証されます。コンストラクタがスローすればどうなりますか? –

+0

VBでは、インスタンスメンバと競合する共有メンバを呼び出す必要がある場合は、クラス名を名前空間で修飾するだけです。競合がない場合、共有メンバへの呼び出しは、インスタンスメンバを共有メンバに「渡し」ます。 –

+0

@ PanagiotisKanavos、実際には、パラメータ名とクラス名が一致する可能性がある問題を分析しています。あなたのパラメータがByRef Bird As Birdで、Bird.flyに電話したらどうでしょうか? –

答えて

4

これは、VB開発者の大多数にとって非常に一般的な名前付けパターンです。 VBの大部分は大文字と小文字を区別しません。このように変数に名前を付けることができないと、変数やクラス名を "創造的"に改名して衝突を避けなければならず、ハンガリー表記や他の奇妙な命名パターンにつながります。それに慣れていない人には奇妙に見えるかもしれませんが、VB開発者にとってはすぐに第2の性質になります。次の例のように、インスタンス変数のsharedメンバーを共有メンバーに「渡す」だけで呼び出します。

Public Class Bird 
    public Shared sub Fly 
     Debug.WriteLine("Fly called from Shared") 
    End sub 

    public sub Quack 
     Debug.WriteLine("Quack called from Instance") 
    End sub 

End Class 

Public Class Main 
    public sub Test(bird As Bird) 
     bird.Fly() 
     Bird.Fly() 

     bird.Quack() 
     Bird.Quack() 
    End sub 
End Class 

Testを呼び出すと、次の出力結果が表示されます。インスタンス

クワックから呼び出さ共有

クワックから呼び出さ共有

フライから呼び出さ

フライは、あなたは、各段落の異なる質問をしているインスタンス

+0

IDEが自動的にこれらを修正するので、 "bird.Fly()"ではなく "Bird.Fly()"が常に表示され、 "bird.Quack()"ではなく "Bird .Quack() " –

+0

正しい。このように表示されるようにするには、自動フォーマットをオフにして、別のケースでもコンパイルして動作することを確認する必要がありました。 –

関連する問題