VB.NET 可空变量显式赋 Nothing 和 从未赋值的判断?

蓝海 2012-04-15 03:21:59
如下代码:

'可空整型;注:iValue 可以是某个类的属性;
dim iValue as integer?

'(1)、这时的 iValue 值为 Nothing

iValue = Nothing '显式赋空

'(2)、这时的 iValue 值理所当然仍为 Nothing


问题如下:

1、怎么判断 Nothing 值是被显式赋上去的,还是默认的 Nothing

2、或者说检查这个变量是否被初始化?
...全文
604 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝海 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]
不用回答了
[/Quote]


什么意思?
q631895585 2012-04-23
  • 打赏
  • 举报
回复
不用回答了
ilooknow 2012-04-20
  • 打赏
  • 举报
回复
先赋一个不会出现的初始值是最简单的,如果没有这种值,就用属性来检测赋值吧!
蓝海 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
引用 21 楼 的回复:
哦,这个不用担心,只要能反映出三种情况就行了:

1、没有值(即 NOTHING),且没有显式赋过值;

2、没有值(即 NOTHING),显式赋过值;

3、有值(非 NOTHING),怎么赋的值都没关系;

1、2情况直接区分不出来,只能自己外加变量控制。
[/Quote]

(外加变量)加了,代码如下(这是 14 楼的代码重新贴一下):

Public Class User
Private mCode As String
Private mAge As Integer?
'这就是那个外加变量, 当给 Age 属性 Set 值时它会变为 True
private mAgeSetValue as boolean = false

Public Property Code() As String
Get
Return mCode
End Get
Set(ByVal value As String)
mCode = value
End Set
End Property

Public Property Age(Optional ByVal isSetValue as boolean = false) As Integer?
Get
If isSetValue then
return mAgeSetValue
else
Return mAge
end if
End Get
Set(ByVal value As Integer?)
mAge = value
if mAgeSetValue=false then mAgeSetValue = true
End Set
End Property
End Class
test2050 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
引用 20 楼 的回复:
引用 19 楼 的回复:
引用 18 楼 的回复:
不需要用new的对象在定义的时候就已经被初始化了。


什么意思?

哦,那正好是 NOTHING ,这个没关系了。。。没有被显式赋过值;

(正好是没用显式调用属性的 SET 方法进行赋值,也还可以区分吧?)

只能区分的出来有没值,而区分不出来是后来赋值成nothing还是初始化的时候的not……
[/Quote]

区分1、2的实际意义何在?什么场合需要判断是否显示赋值为nothing
蓝海 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
不需要用new的对象在定义的时候就已经被初始化了。
[/Quote]

什么意思?

哦,那正好是 NOTHING ,这个没关系了。。。没有被显式赋过值;

(正好是没用显式调用属性的 SET 方法进行赋值,也还可以区分吧?)
ziyouli 2012-04-18
  • 打赏
  • 举报
回复
不需要用new的对象在定义的时候就已经被初始化了。
蓝海 2012-04-18
  • 打赏
  • 举报
回复
是这样的;

大家继续探讨。。。

期待不同的、更简单的处理办法。。。

[Quote=引用 16 楼 的回复:]
dim isInit as boolean = user.Age(true) 'isInit 返回 Age 是否被显式赋过值

'因为这个属性只返回 Integer 型数据,所以要下面这样才行,
'intIsInit=1 表示显式赋过值,intIsInit=0 表示没有赋过值;
dim intIsInit as integer = user.Age(true)
[/Quote]
make_sail 2012-04-18
  • 打赏
  • 举报
回复
dim isInit as boolean = user.Age(true) 'isInit 返回 Age 是否被显式赋过值

'因为这个属性只返回 Integer 型数据,所以要下面这样才行,
'intIsInit=1 表示显式赋过值,intIsInit=0 表示没有赋过值;
dim intIsInit as integer = user.Age(true)
蓝海 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
想来想去,还是这么做吧,代码如下:


VB.NET code
Public Class User
Private mCode As String
Private mAge As Integer?
private mAgeSetValue as boolean = false

Public Property Code() As String
……
[/Quote]

写错了!
蓝海 2012-04-18
  • 打赏
  • 举报
回复
想来想去,还是这么做吧,代码如下:

Public Class User
Private mCode As String
Private mAge As Integer?
private mAgeSetValue as boolean = false

Public Property Code() As String
Get
Return mCode
End Get
Set(ByVal value As String)
mCode = value
End Set
End Property

Public Property Age(Optional ByVal isSetValue as boolean = false) As Integer?
Get
If isSetValue then
return mAgeSetValue
else
Return mAge
end if
End Get
Set(ByVal value As Integer?)
mAge = value
if mAgeSetValue=false then mAgeSetValue = true
End Set
End Property
End Class


这样的话,对 Age 属性的原操作不用发生任何变化;

只是多了一个特殊的属性返回操作方式,如:
dim user as new User
...
dim isInit as boolean = user.Age(true) 'isInit 返回 Age 是否被显式赋过值
'原来的赋值、取值都不变
dim userAge as integer
user.Age = 30 '不变的赋值语句
userAge = user.Age '这个取值语句也一样没有任何变化


不知道大家还有没有更好,更简单的办法?

求共同探讨。。。
蓝海 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
可以考虑用初始值办法,把mAge定义一个正常使用不会用到的默认值,例如负数
然后判断这个值就可以知道这个属性有没有赋过值了,只供参考的笨办法,呵呵
[/Quote]

是啊,这个办法我也想过:

1、要么再建一个属性(虽然这么做是很好,但如果这样的类太多的话,代码成本也不小了);

2、要么按这个办法也可以,这样做的好处是有几种 DataType?,做几个处理过程就行了;

如:A、如果是 NOTHING 说明未赋过值;
B、如果是这个默认值,(以 INTEGER? 为例,mAge=Integer.MinValue 时表示 NULL)
C、否则为正常 INTEGER 类型的值;

但这个却要丢掉 Integer.MinValue 这个值了,不是不可以这么做,
只是这个值在编码时要特别的注意了;

ziyouli 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
哦,这个不用担心,只要能反映出三种情况就行了:

1、没有值(即 NOTHING),且没有显式赋过值;

2、没有值(即 NOTHING),显式赋过值;

3、有值(非 NOTHING),怎么赋的值都没关系;
[/Quote]
1、2情况直接区分不出来,只能自己外加变量控制。
allanli 2012-04-18
  • 打赏
  • 举报
回复
可以考虑用初始值办法,把mAge定义一个正常使用不会用到的默认值,例如负数
然后判断这个值就可以知道这个属性有没有赋过值了,只供参考的笨办法,呵呵
蓝海 2012-04-18
  • 打赏
  • 举报
回复
我本想在不改变下面类体现有代码的情况下,实现检查 Age 属性是否显示赋过值(这值无论是否 Nothing),看样子好像是做不到了。。。


Public Class User
Private mCode As String
Private mAge As Integer?

Public Property Code() As String
Get
Return mCode
End Get
Set(ByVal value As String)
mCode = value
End Set
End Property

Public Property Age() As Integer?
Get
Return mAge
End Get
Set(ByVal value As Integer?)
mAge = value
End Set
End Property
End Class
蓝海 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
引用 19 楼 的回复:
引用 18 楼 的回复:
不需要用new的对象在定义的时候就已经被初始化了。


什么意思?

哦,那正好是 NOTHING ,这个没关系了。。。没有被显式赋过值;

(正好是没用显式调用属性的 SET 方法进行赋值,也还可以区分吧?)

只能区分的出来有没值,而区分不出来是后来赋值成nothing还是初始化的时候的nothing
[/Quote]

哦,这个不用担心,只要能反映出三种情况就行了:

1、没有值(即 NOTHING),且没有显式赋过值;

2、没有值(即 NOTHING),显式赋过值;

3、有值(非 NOTHING),怎么赋的值都没关系;

目前只要有这三种情况就够了。。。
ziyouli 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
引用 18 楼 的回复:
不需要用new的对象在定义的时候就已经被初始化了。


什么意思?

哦,那正好是 NOTHING ,这个没关系了。。。没有被显式赋过值;

(正好是没用显式调用属性的 SET 方法进行赋值,也还可以区分吧?)
[/Quote]
只能区分的出来有没值,而区分不出来是后来赋值成nothing还是初始化的时候的nothing
devmiao 2012-04-17
  • 打赏
  • 举报
回复
语言本身没有这样的功能哦。

可以使用ReadOnly关键字限制变量被更改,或者定义一个类:

class ReadOnlyValue<T>
{
public T Value { get; private set; }
public ReadOnlyValue(T value)
{
Value = value;
}
}
lmhcs 2012-04-17
  • 打赏
  • 举报
回复
嗯。。。第一次知道有可空的类型,学习了。不过这个有什么用处呢?
贫下码农 2012-04-17
  • 打赏
  • 举报
回复
如果不想用属性判断的方法,就用标识方法,大概思路如下:

public pVal(?) boolean '?为变量个数

'-------------------------------------

dim iVal integer
pVal(0)=False

'---------------------------
iVal=Nothing
pVal(0)=True


只要判断pVal(0)值就可以了

if pVal(0) then
msgbox"iVal 是显式赋值 Nothing"
else
msgbox"iVal 是默认赋值 Nothing"
end if
加载更多回复(7)
Vb写的俄罗斯方块 基本功能全'声明一个整数常量Width,表示游戏界面横向的小正方形数目,初始化为16 Public Const Width As Integer = 16 '声明一个整数常量Height,表示游戏界面横向的小正方形数目,初始化为30 Public Const Height As Integer = 30 '游戏界面的背景色 Public Shared BackColor As Color '小正方形的大小 Public Shared SquareSize As Size = New Size(10, 10) Public Shared g As Graphics '声明一个Graphics变量,用于绘制下一个方块 Public Shared gNext As Graphics '声明一个数组,用于表示游戏界面上的所有小正方形 Private Shared ArrGameField(Width - 1, Height - 1) As CSquare '函数功能:判断ArrGameField(x, y)是否有正方形,有则返回False,无则返回True Public Shared Function IsEmpty(ByVal x As Integer, ByVal y As Integer) As Boolean If x >= 0 And x = 0 And y =0 '在循环体中,先判断第y行是否是满的,是的话result增1,并把第y行上的所有小正方形下降一行.最后y递减1 '如果实现把第y行的所有小正方形下降一行:从第y行扫描至第0行,每扫描一行,把上一行的每个小正方形给该行,并修改每一个小正方形的Location属性的值 While Y >= 0 If IsLineFull(Y) Then result += 1 For i As Integer = Y To 0 Step -1 If i > 0 Then For x As Integer = 0 To Width - 1 ArrGameField(x, i) = ArrGameField(x, i - 1) If Not ArrGameField(x, i) Is Nothing Then ArrGameField(x, i).Location = New Point(ArrGameField(x, i).Location.X, ArrGameField(x, i).Location.Y + SquareSize.Height) End If Next Else For x As Integer = 0 To Width - 1 ArrGameField(x, i) = Nothing Next End If Next Else

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧