C# 中类型转换的最佳实践是什么? [复制]

2024-03-15

哪种方法是类型转换和检查的最佳实践?

Employee e = o as Employee;
if(e != null)
{
 //DO stuff
}

OR

if(o is Employee)
{
Employee e = (Employee) o;
 //DO stuff
}

至少有两种可能性进行铸造,一种用于类型检查,另一种是两者的组合,称为模式匹配。每个都有其自己的目的,这取决于具体情况:

硬铸 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/invocation-operator#cast-expression

var myObject = (MyType)source;

如果您绝对确定给定对象是否属于该类型,通常会这样做。如果您订阅了事件处理程序并将发送者对象转换为正确的类型来处理该事件,则使用它的情况。

private void OnButtonClick(object sender, EventArgs e)
{
    var button = (Button)sender;

    button.Text = "Disabled";
    button.Enabled = false;
}

软铸件 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as

var myObject = source as MyType;

if (myObject != null)
    // Do Something

如果你不知道你是否真的有这种类型,通常会使用它。因此,只需尝试强制转换它,如果不可能,只需返回 null 即可。一个常见的例子是,只有在某个接口被填充时才必须执行某些操作:

var disposable = source as IDisposable;

if(disposable != null)
    disposable.Dispose();

还有as运算符不能用于struct。这只是因为操作员想要返回一个null万一演员失败并且struct永远不可能null.

类型检查 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is

var isMyType = source is MyType;

这很少被正确使用。仅当您只需要知道某物是否属于特定类型但不必使用该对象时,此类型检查才有用。

if(source is MyType)
   DoSomething();
else
   DoSomethingElse();

模式匹配 https://learn.microsoft.com/en-us/dotnet/csharp/pattern-matching

if (source is MyType myType)
    DoSomething(myType);

模式匹配是 dotnet 框架中与强制转换相关的最新功能。但您也可以使用以下方法处理更复杂的情况switch语句 https://learn.microsoft.com/en-us/dotnet/csharp/pattern-matching#using-pattern-matching-switch-statements当子句 https://learn.microsoft.com/en-us/dotnet/csharp/pattern-matching#when-clauses-in-case-expressions:

switch (source)
{
    case SpecialType s when s.SpecialValue > 5
        DoSomething(s);
    case AnotherType a when a.Foo == "Hello"
        SomethingElse(a);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中类型转换的最佳实践是什么? [复制] 的相关文章

随机推荐

  • 使用 WebSockets 的自托管 WCF 无法使用 SSL 工作

    我在控制台应用程序中有这段代码 我正在尝试从 chrome 开发工具进行连接 但出现此错误 尽管问题肯定在 WCF 端 WebSocket connection to wss 127 0 0 1 5650 Echo failed Error
  • Javascript for 循环 Promise

    我有一个像这样的网址数组 var urls www google com www yahoo com 我想循环遍历 url 并在循环内执行异步任务 并且在异步任务完成之前不会继续执行下一个项目 我知道你可以通过承诺做到这一点 但我在这方面遇
  • 可以直接在浏览器中运行C代码吗?

    除了性能考虑之外 是否有任何已知的方法可以采用现有的 C C 或 Objective C 代码并直接在浏览器中运行它 例如 编译器将所有代码转换为某种可以在浏览器中运行的解释性语言 就像 Javascript Actionscript 和
  • 使用单击功能将 php 变量传递到模态窗口

    我有一个启动模式窗口的单击功能 在模态窗口内部 我加载 modal window php 点击函数如下所示 a testmodal click function e varid get modal window php id varid f
  • jQuery 美元符号未定义

    在我寻求获取历史信息的过程中 我尝试使用下面的代码 Chrome 调试器说Uncaught ReferenceError is not defined 你能建议一个解决办法吗 我真的被困住了 我只需要它在 Chrome 上工作 并且我正在利
  • Twitter 搜索 API - 无法使用?

    经过多次测试 我无法让 Twitter 搜索 API 返回超过 80 的包含特定关键字或话题标签的推文 这与最大结果数无关 一项测试涉及已被推文 50 次的主题标签 而 Twitter 搜索 API 仅返回了其中的 15 个 使用 Twit
  • 使用 Marshmallow 序列化 SQLAlchemy

    我正在遵循教程并使用下面的代码 我还使用 Postman 查看服务器的状态http localhost 5000 行星 http localhost 5000 planets 但我得到了500内部服务器错误 当我应该看到我创建的行星的 JS
  • 在给定顶点坐标的情况下查找图中的所有循环基

    类似的问题发布在这里 https stackoverflow com questions 1607124 algorithms to identify all the cycle bases in a undirected graph 我有
  • 在 pandas 中用分组依据的总数百分比注释每一行?

    我有一个如下所示的数据框 Company Speciality Payment AcmeCorp Roofing 50 00 AcmeCorp Grounding 50 00 LolCorp Roofing 106 00 LolCorp G
  • 我如何从标签获取对象?

    我有一个视图 在该视图中我有 2 个按钮 我知道那个按钮的标签 我想更改该按钮的图像 我如何通过这个标签更改图像 UIButton button UIButton myView viewWithTag myTag button setIma
  • 在运行时添加动画

    我想要动画化我的AnimatedVectorDrawable在运行时不使用 xml文件 其实我正在使用 xml文件的方式与文档示例显示的方式相同 动画矢量Drawable https developer android com refere
  • 如何修复 String 字段未实现“Copy”? [复制]

    这个问题在这里已经有答案了 我正在用 Rust 构建一个简单的命令行待办事项应用程序 如果我不实现复制特征 我会收到此错误 发生移动是因为 todo 具有类型 todo Todo 它没有实现 复制 特征 当我尝试为 Todo 结构实现 Co
  • 不使用自定义 UI 编辑器创建 Excel 2007 功能区

    谁能告诉我是否可以在 Excel 2007 中创建自定义功能区 而不使用 自定义 UI 编辑器 软件 使用编辑器确实很容易 但在我工作的地方 我们无法下载外部软件 有没有其他方法可以像记事本 word一样做到这一点 提前谢谢了 我也无法安装
  • 如何通过 jQuery 删除值中的反斜杠?

    if this val 有反斜杠 通过 jQuery 删除其中的反斜杠 如何 1111 11 11 gt 1111 11 11 this val replace g 您必须使用两个反斜杠来获取 字符 单反斜杠用于控制字符 例如 r n 等
  • 使用基于表格的公式来确定要设置格式的单元格

    I have a table called MyTable and I want to use conditional formatting to format the entire row of a table using a condi
  • 数据模型和对象模型有什么区别?

    CWM是数据建模 UML 是对象建模 有人可以解释一下外行可以理解的区别吗 对象模型 处理系统的面向对象 蓝图 这包括类图 您将要创建的类 这些类之间的关系 类中的方法 属性等 数据模型 处理数据库级别的实体 比如 OM 中的类如何存储在数
  • 使用贝叶斯类进行数字识别

    我需要编写一个仅用于数字的 OCR 程序 我将使用 MNIST 数据集 问题是我不知道从哪里开始 有很多论文并没有真正解释算法 我对模式识别真的了解不多 所以我有几个问题 Q1 在哪里可以找到算法 或教程 Q2 如何对数字进行分类 我不需要
  • PHP 文件无法在浏览器中打开 - 只能下载。我需要更改什么才能使其正常工作?

    我尝试过重新安装 PHP PHP 正在运行 Apache2 正在运行 我不知道为什么它无法在浏览器中打开并正常显示 想让你知道 我的 httpd conf 是空的 而我的所有内容都在 apache2 conf 中 这是因为我使用的是 Ubu
  • 将 .js 控制器请求渲染为 html

    我有一个before filter在我的 Rails 应用程序中 将用户发送到login url如果他们在提交请求 以 html 或 js 格式 时注销 我想要我的format js产生相同的结果format html 在以下情况下使用 通
  • C# 中类型转换的最佳实践是什么? [复制]

    这个问题在这里已经有答案了 哪种方法是类型转换和检查的最佳实践 Employee e o as Employee if e null DO stuff OR if o is Employee Employee e Employee o DO