哪个(如果有的话)更正确?为什么?
string someVariable = (string) someOtherVariable;
string someVariable = someOtherVariable.ToString();
string someVariable = someOtherVariable as string;
Run Code Online (Sandbox Code Playgroud)
我已经使用了所有三个,但我没有任何偏好或理解为什么一个比另一个好.
And*_*are 10
这些都不是铸造的例子.
这是一个演员:
string someVariable = (string) someOtherVariable;
Run Code Online (Sandbox Code Playgroud)
这是方法调用:
string someVariable = someOtherVariable.ToString();
Run Code Online (Sandbox Code Playgroud)
这是一个安全的演员:
string someVariable = someOtherVariable as string;
Run Code Online (Sandbox Code Playgroud)
第一个和第三个例子是实际演员表.第一个演员有可能抛出一个InvalidCastException而第三个例子不会抛出该异常.这就是为什么as操作员被称为安全演员.
这是我关于这个主题的文章.
至于哪一个是"最正确的",最正确的那个是具有你打算传达给程序读者的意思的那个.
"ToString()"传达"这可能不是一个字符串;如果不是,那么我希望从对象中获得一个代表它的字符串."
"cast"操作符传达"这是一个字符串,我愿意让我的程序崩溃,如果我错了",或相反,"这不是一个字符串,我想调用用户定义的转换对象到字符串".
"as"运算符表示"这可能是一个字符串,如果不是,我希望结果为空."
你指的是这四件事中的哪一件?
这三个做不同的事情 - 没有一个是"更正确",这取决于你的情况.如果你有一堆可能不是字符串的对象,你可能会使用.ToString()(如果你期望空值,则使用空检查).
如果您只关心非空字符串,但仍希望接收非字符串,请使用"as"强制转换,然后忽略以null形式出现的值(它们原来是null,或者是非字符串类型)
如果你希望只收到字符串,最好使用(字符串)强制转换.这表达了代码中最好的意图.
object foo = 5;
string str = (string)foo; // exception
string str = foo as string; // null
string str = foo.ToString(); // "5"
object foo = "bar";
string str = (string)foo; // "bar"
string str = foo as string; // "bar"
string str = foo.ToString(); // "bar"
object foo = null;
string str = (string)foo; // null
string str = foo as string; // null
string str = foo.ToString(); // exception
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2601 次 |
| 最近记录: |