C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■91952 / 3階層)  RectangleのようなStructureの作り方
□投稿者/ Hongliang (858回)-(2019/08/13(Tue) 18:50:42)
> 事前に計算しておく方法も
> できればお教えいただけないでしょうか?

Private _Left, _Bottom, _Theta As Double
' まずはコンストラクタで計算
Public Sub New(ByVal left AS Double, ByVal bottom As Double, ...)
    Me._Left = left
    Me._Bottom = bottom
    ' ほかの処理があるかもしれないけど省略
    Me.CalcTheta()
End Sub
Private Sub CalcTheta()
    Me._Theta = Atan(Me._Left / Me._Bottom)
End Sub
' Leftとかを変更可能なら、そこのSetでも再計算
' ただし、Structureは基本的にプロパティはすべてReadOnlyにすべき
Public Property Left() As Double
    Get
        Return Me._Left
    End Get
    Set
        Me._Left = Value
        Me.CalcTheta()
    End Set
End Property
' Thetaは計算済みの値を返すだけ
Public ReadOnly Property Theta() As Double
    Get
        Return Me._Theta
    End Get
End Property

> Me.Left とMe.Bottomに両方、値が格納される前に
> Thetaを取得しようとするとNothingを返すようにしたいのですが、
> どうすれば良いですか?

VBだと、Nothingが何を意味するのかが曖昧です。
CDbl(Nothing)は0.0を意味し、0.0 = Nothing はTrueを返します。
(0.0 Is Nothingはコンパイルエラーになりますが)
このことから単に0.0を返せばいいのであれば、そのようにすればいいです。

一方、Is Nothing判定をできるようにしたいのであれば、Thetaの型として Doubleを使うことはできません。
代わりに Double? 型(Nullable(Of Double) の省略形)を使用することになるでしょう。
この場合、
Public ReadOnly Property Theta() As Double?
    Get
        ' このIfはステートメントではなく演算子
        Return If(Me.Left = 0 OrElse Me.Bottom = 0, Nothing, Atan(Me.Left / Me.Bottom))
    End Get
End Property

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[2]: RectangleのようなStructureの作り方 /yukata →Re[4]: RectangleのようなStructureの作り方 /Hongliang
 
上記関連ツリー

RectangleのようなStructureの作り方 / yukata (19/08/13(Tue) 18:01) #91948
Re[1]: RectangleのようなStructureの作り方 / Hongliang (19/08/13(Tue) 18:08) #91949
  └ Re[2]: RectangleのようなStructureの作り方 / yukata (19/08/13(Tue) 18:21) #91950
    └ RectangleのようなStructureの作り方 / Hongliang (19/08/13(Tue) 18:50) #91952 ←Now
      └ Re[4]: RectangleのようなStructureの作り方 / Hongliang (19/08/13(Tue) 19:28) #91953
        └ Re[5]: RectangleのようなStructureの作り方 / yukata (19/08/14(Wed) 15:30) #91954
          └ Re[6]: RectangleのようなStructureの作り方 / yukata (19/08/14(Wed) 15:31) #91955 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信