2016-03-27 30 views
0

私は1つのまたはNewなしStringを作成することができることに気づい:新規作成しないオブジェクトを作成しますか?

または

Dim s As New String(" "c, 4) 

第二の方法はStringがクラスのインスタンスであることを私に示唆しています。最初の方法は、Newを使わずにオブジェクトを作成できることを示唆しています。しかし、Newを除いて自分のクラスのインスタンスを作成しようとすると、初期化されていない参照エラーが発生します。私は何が欠けていますか?

P.S:私は自分の考えを持っている:String構造、ないクラスとして定義されます。これが正しいかどうか確認してください。

+0

@Plutonix - 最初の方法は、文字列を空であると定義していないので、 'Nothing'(または' null')です。 – Enigmativity

+0

@Enigmativityはい - 私は実際に目が覚めていたとは思わない – Plutonix

答えて

0

これは新しいStringオブジェクトを作成しません。これはsがタイプStringの変数であることを宣言します。これは、その変数を使用しようとしたときにNullReferenceExceptionを取得する理由です。

Dim s As New String(" "c, 4) 

これはタイプStringとして可変sを宣言し、特定の値に変数を初期化します。

2番目の方法は、Stringがクラスインスタンスであることを私に示唆しています。

私は自分のアイデアを持っています:文字列は、クラスではなく構造として定義されています。これが正しいかどうか確認してください。

Stringはクラスタイプです。 official documentationでの定義を参照してください:

<SerializableAttribute> 
<ComVisibleAttribute(True)> 
Public NotInheritable Class String 
    Implements IComparable, ICloneable, IConvertible, IEnumerable, 
    IComparable(Of String), IEnumerable(Of Char), IEquatable(Of String) 
+0

私はこれが本当だとは思わない。最初の宣言は定義です。 's'は空の文字列になります。特に、その後に 's&=" a "を実行することができます。問題はどうですか? – AlwaysLearning

+0

@AlwaysLearning - 最初の方法は空の文字列ではなく、 'Nothing'(または' null')です。あなたはいつも 'Nothing'で連結を行うことができます。これはうまくいきます: 'Dim s As String = Nothing&" Foo "'、結果は単純に '' Foo''です。 – Enigmativity

+0

しかし 's'を' New'なしで 'String'と宣言した後に' Console.WriteLine(s) 'を実行するにはどうしたらいいですか? Visual Studioから警告が出ますが、プログラムを実行すると例外はスローされません。 – AlwaysLearning

0

は、より簡単に少し説明するには、次のコードを使用している場合、

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim a As String 
    MessageBox.Show(a) 
End Sub 
まだあなたのメッセージボックスラインでエラーが発生します

のVisual Studio: -

変数 'a'は、値が割り当てられる前に使用されます。実行時にnull参照例外が発生する可能性があります。

それは薄暗い文で宣言されているときに、あなたはまだ単なる文字列型で、それに割り当てられた文字列を持っていないオブジェクトを持っています。

文字列は間違いなくクラスです。

+0

エラーではなく警告です。 「結果」とはどういう意味ですか?未定義の動作ですか? – AlwaysLearning

+0

申し訳ありませんが、警告はエラーではありません。オブジェクトを割り当てる前にオブジェクトから値を取得しようとすると、null参照例外が発生しますが、値を代入すると、その値は割り当てられません。 :) –

+0

本当に。 's'を' New'なしで 'String'として宣言した後に' Console.WriteLine(s) 'を実行できます。例外はスローされません... – AlwaysLearning

関連する問題