在转换变量时语法的最佳实践是什么?

Dea*_*ane 7 c#

哪个(如果有的话)更正确?为什么?

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操作员被称为安全演员.

  • @Deane:它将返回null. (3认同)
  • 如果类型不是已实现或继承的类型,则使用"as"运算符将返回null.尚未提及的其他内容是"as"运算符不会导致隐式或显式转换,但执行"(type)variable"将在需要时执行转换. (2认同)

Eri*_*ert 6

这是我关于这个主题的文章.

http://blogs.msdn.com/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

至于哪一个是"最正确的",最正确的那个是具有你打算传达给程序读者的意思的那个.

"ToString()"传达"这可能不是一个字符串;如果不是,那么我希望从对象中获得一个代表它的字符串."

"cast"操作符传达"这是一个字符串,我愿意让我的程序崩溃,如果我错了",或相反,"这不是一个字符串,我想调用用户定义的转换对象到字符串".

"as"运算符表示"这可能是一个字符串,如果不是,我希望结果为空."

你指的是这四件事中的哪一件?


Jim*_*mmy 5

这三个做不同的事情 - 没有一个是"更正确",这取决于你的情况.如果你有一堆可能不是字符串的对象,你可能会使用.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)