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;
返回值最好统一返回,便于设置断点跟踪。
原文链接: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;
返回值最好统一返回,便于设置断点跟踪。
相关文章推荐
- C#位操作与枚举的应用
- C#中comboBox绑定数据集后事件中取值出System.data.dataRowView问题
- C# 创建Excel并写入内容
- 编写高质量代码改善C#程序的157个建议——建议70:避免在调用栈较低的位置记录异常
- C#实现多线程界面刷新
- C#值类型与引用类型间转换
- 编写高质量代码改善C#程序的157个建议——建议69:应使用finally避免资源泄漏
- c# WindowsService 的发布
- 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
- C#中值类型和引用类型的区别深度分析
- C# Powerpoint 禁止或允许修改形状
- C#搜索文字在文件及文件夹中出现位置的方法
- 编写高质量代码改善C#程序的157个建议——建议67:慎用自定义异常
- 设计模式C#实现(二)——适配器模式
- C#多线程同步事件及等待句柄
- C#统计C、C++及C#程序代码行数的方法
- C# 未将对象引用设置到对象的实例
- C#中 哪些是值类型 哪些是引用类型
- c# 二元表达式
- 大白话系列之C#委托与事件讲解大结局