【问题标题】:Subclassing C#'s object?子类化 C# 的对象?
【发布时间】:2010-08-12 16:48:32
【问题描述】:

对于我正在制作的程序,我使用object 来保存 HTML 属性的值。如果我在整个程序中对这些值做一些事情,就会有很多事情。所以我基本上想为object创建一个别名,用于将HTML属性的值保存为AttrValue之类的东西,只是为了使程序更清晰,并且能够在需要时轻松添加功能。这些对象用于程序的关键性能部分,所以我不确定创建一个类而不是结构是否是最好的主意。如果性能是主要关注点(实际上不仅仅是清晰度),这里最好的解决方案是什么?

【问题讨论】:

  • 你知道接口和/或继承吗?
  • 我不明白你在说什么。 “为对象创建别名”——这是什么意思?
  • @Kirk Woll,@jsoldi 似乎希望在他们的系统中实现类型安全。
  • 另外,默认情况下,所有类都继承自object (System.Object)。
  • 好吧,在 C++ 上,您可以执行以下操作:typedef SomeClass AttrValue; 这意味着 AttrValue 只是一个 SomeClass,但有另一个名称。在 C# 中与class AttrValue : SomeClass {} 基本相同,但我不知道使用object 而不是SomeClass 的最佳方法是什么。

标签: c# .net


【解决方案1】:

您可以创建一个类型别名,例如using AttrValue = System.Object;。但是,此别名仅存在于您的源代码中。没有什么可以阻止您使用objectstring 等您需要AttrValue 的地方。您将无法将属性或方法添加到您的 AttrValue 别名:它将是 object 的别名,而不是其本身的类。

您最好将AttrValue 本身作为一个类引入,大概作为object 类型值的包装器。它可能有一个字段(object 类型)和一个带有一个 object 参数的构造函数。

关于结构与类,我不会担心这个。您几乎不需要 .NET 代码中的结构:垃圾收集器能够处理大量小类实例而没有明显的开销,并且structs have their own oddities(主要是因为在源代码中看起来相同的实例很容易最终成为两个独立的在运行时复制)。

【讨论】:

  • 我相信如果我使用using AttrValue = System.Object,我需要把它放在我需要对象别名的每个文件上,对吧?
  • 对 - C# 类型别名仅存在于源代码级别。在编译后的代码中,你不会看到AttrValue,只有object
【解决方案2】:

嗯,第一个问题是……你为什么用object

HTML 是文本,因此所有 html 属性都是字符串。您可能希望将它们转换为其他数据类型(整数或枚举),但将它们存储为对象并无济于事。

【讨论】:

  • 其中一些,如文本颜色,在我的程序中被视为整数。
  • 然后将它们转换为 int 后,将它们存储在 int 中。
  • 我真的只是宁愿把它当作一个对象
【解决方案3】:

如果继承是一个性能问题,那么 .NET 就会出现一些重大问题。继承是 C# 中的一个基本概念,它可以很好地工作和执行。我建议你创建一个后代类并使用它。

public class HtmlAttrValue: System.Object;

如果你真的想要,你也可以在 C# 中创建一个类型别名,虽然不如其他一些语言。 C# 中的类型别名仅适用于定义它的文件。

using HtmlAttrValue = System.Object;

这种支持很差,也不是很知名,我不推荐它。您可能还会发现将您的 HTML 视为 XHTML(如果可能)并使用一些现有的 XML 类型和类来为您完成工作会更方便。

【讨论】:

  • 你可以从类声明中去掉: System.Object,因为它是隐式的。
  • 好的,现在,如果我使用public class HtmlAttrValue: System.Object{},我如何访问底层对象?我的意思是,如果在我的程序中,现在我这样做:` void SomeFunc(object rawValue) { object attrValue = rawValue; } ` 当attrValueAttrValue 的一个实例时,我该怎么做?即使该类本身是object,我是否应该将object 字段添加到AttrValue 类?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
相关资源
最近更新 更多