您的位置:首页 > 编程语言 > C#

C#结构体对象不能为空如何处理

2015-08-18 14:16 465 查看
本来是想知道结构体如何判空,了解下来的结果各有千秋,偶然间看到一位前辈写的C#结构体对象不能为空如何处理,见证了前辈从遇到问题,抛出问题,最后解决问题的过程。

原文链接:http://game.ceeger.com/forum/read.php?tid=3480

public static enemy find(string n)
{
enemy result = null;
foreach(enemy go in enemys)
{
if(go.name == n)
{
result = go;
}
}
return result;
}
"result是结构体Enemy的对象。result最终要为引用类型。所有不能new.
但是不new赋值空的话,会报错这个类型不能赋值空。如果不赋值就会报错未定义。"

这是我当时的问题,今天看相关资料时,无意中发现了"可空类型",试了一下的确可以解决。
首先加上using System命名空间.然后给result加上可空类型: Nullable<enemy> result = null;即可

public static enemy find(string n)
{
Nullable<enemy> result = null;
foreach(enemy go in enemys)
{
if(go.name == n)
{
result = go;
}
}
return result.value;
}
当时感觉这么神奇,只在前面加上一个可空类型就可以了,然后我又看到了更经典的。

所有的值类型都可以通过加“?”来添加对空对象的支持,这个可以看做对楼主写法的一种语法糖,所以比较好的写法是
public static enemy? find(string n)
{
enemy? result = null;
foreach(enemy go in enemys)
{
if(go.name == n)
{
result = go;
}
}
return result;
}
这样也行,太神奇了,就只是加了一个问号而已。我又去找了语法糖。
还有一个小伙伴回答说:

如果enemys是一个List集合的话,只需一行代码:
public static Enemy Find(string name)
{
//List<Enemy> enemys = new List<Enemy>();
return enemys.Find(item => item.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
}
而如果enemys是一个Collection集合,中间代码可以这么写:
Enemy result = null;
foreach (Enemy enemy in enemys)
{
if (enemy.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase))
{
result = enemy;
break;
}
}
return result;

返回值最好统一返回,便于设置断点跟踪。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: