Tag: oop

c#:Inherited / interface静态成员?

有没有办法要求一个类有一个特定的抽象成员? 像这样的东西: public interface IMaxLength { public static uint MaxLength { get; } } 或许这个: public abstract class ComplexString { public abstract static uint MaxLength { get; } } 我想强制一种类型(通过inheritance或接口?)具有静态成员的方式。 可以这样做吗?

为什么OOP中静态类的最佳实践会有所不同?

我目前正在阅读有关Java最佳实践的内容,我发现根据本书,我们必须支持静态类而非非静态类 。 我记得在C#最佳实践中,我们必须根据Dennis Doomen的C#3.0,4.0和5.0编码指南来避免这种情况: AV1008 – 避免静态类 除了扩展方法容器之外,静态类通常会导致设计错误的代码。 除非你愿意使用一些非常黑客的工具,否则即使不是不可能,它们也是非常困难的。 注意如果您确实需要该静态类,请将其标记为静态,以便编译器可以阻止实例成员并实例化您的类。 这可以减轻您创建显式私有构造函数的麻烦。 我发现这两个用于C#答案和Java答案何时使用和避免静态类,但仅仅是好奇心 – C#和Java都是OOP语言,为什么它在最佳实践中是完全不同的? 更新:我不能从Java书中复制这么多页面,但底线是: 如果声明一个不需要访问封闭实例的成员类,则始终将static修饰符放在其声明中,使其成为静态成员类而非非静态成员类。 如果省略此修饰符,则每个实例将对其封闭实例具有无关的引用。 存储此引用会花费时间和空间,并且可能导致封闭实例被保留,否则它将有资格进行垃圾回收(第6项)。 如果您需要分配没有封闭实例的实例,您将无法这样做,因为非静态成员类实例需要具有封闭实例。 私有静态成员类的常见用法是表示由其封闭类表示的对象的组件。 它只是关于性能吗? 请注意,这个问题更多的是关于静态类和OOP ,而不是Java和C#之间的差异。

应用程序中随处可访问数据库

如果我想在Delphi中访问数据库,我可以将一个数据模块添加到项目中,从我的mainform配置它,然后在应用程序的任何地方访问它; 引用将存储在全局变量中。 我知道在C#和其他更现代的OO语言中,全局变量都是不受欢迎的。 那么如何从我需要的地方访问我的数据库呢? 我遇到的最大问题是配置:位置,用户,密码等在设计时是未知的。 我现在有一个db-class并在需要时创建一个新实例,但是我必须将这些设置存储在一些全局可访问的东西中,我只是简单地解决了问题。 什么是标准解决方案? 谢谢,问候,Miel。

C#中的属性或变量

可能重复: 属性与字段:需要帮助掌握属性对字段的使用。 我在课堂上看过属性和变量。 你能告诉我们我们使用哪种情况属性以及我们使用变量的场景。

为什么抽象类不能被实例化,什么是无法实例化的类的使用

我知道并阅读有关抽象类和接口的内容,但我从未理解的一点是,无法实例化的类的用法是什么。 我可以使用普通类和虚方法而不是抽象类吗? 当我实例化基类时会发生什么?

实例化generics类型?

我目前正在研究generics集合类,我想创建一个从集合中返回对象的方法。 如果集合中不存在特定对象,则应创建对象,将其添加到集合中,然后返回。 我遇到了一些问题。 generics集合if表示抽象类的类型,我在实例化时遇到问题。 这是我的class级定义: public class CacheCollection : List<CacheItem> where T : EntityBase 这是我工作的部分完整的方法: public T Item(int Id) { CacheItem result = this.Where(t => t.Entity.Id == Id).First(); if (result == null) //item not yet in cache, load it! { T entity = new T(Id); //design time exception here: Cannot create an instance of the […]

哪个有更好的表现? 静态与对象

我设计了一个C#控制台应用程序,使用OOP设计合并和拆分大文件(大小约4GB)。 它涉及读/写xml,平面文件和图像。 我为读者和作家提供课程。 合并时间约为00:12,而分裂时间超过04:30。 然后,我通过将输出文件分发到子目录而不是使用单个目录,将分割的性能提高到00:50。 我的老板要求我将所有内容转换为静态过程编程,而不是对象。 他说00:12合并比较00:50分裂是不平衡的。 他希望在00:30分钟完成分裂,转换成静态。 现在我知道静态调用会更快。 但是我不同意所有静态都会更好,因为我必须在方法中使用“ref”和“out”参数。 我的问题是: 将文件拆分到子目录的原因比使用单个输出目录快得多? (即大量文件> 200,000) 有没有比将代码从对象转换为静态更好的方法,以实现更高的性能?

如何处理时间耦合?

我因此而苦苦挣扎: 我的类有一些具有时间耦合的方法。 也就是说,必须首先调用MethodA ,以“初始化” MethodB需要正常工作的数据。 我通常通过将违规依赖项 作为参数传递给“MethodB”来显式化时间耦合,就像在这个片段中一样: private class SomeClass { private string field; private int count; public SomeClass() { MethodA(); MethodB(field); } private void MethodA() { field = “Something”; } private void MethodB(string str) { count = str.Length; } } 虽然它使事情明确,但我觉得我做错了。 我最终得到的方法根本就不使用字段(静态方法!),所以这个类开始变得不那么紧密了。 这是最好的方法吗? (通过传递参数失去凝聚力) 编辑:关于一些建议使用字段作为构造函数中的参数或使用构建器模式来避免无效状态的答案: 我不能这样做,因为在我的情况下我正在构建一个Parser 。 MethodA读取输入并根据它设置状态(从文件中读取字符),然后调用MethodB。 必须以正确的顺序调用它们。 这是真正的问题:应该在另一个之前调用一个。

收集属性应该只读 – 漏洞?

在遵守代码分析错误的过程中,我正在更改我的属性以拥有私有的setter。 然后我开始尝试理解为什么多一点。 根据一些研究,MS说: 可写集合属性允许用户使用完全不同的集合替换集合。 答案在这里指出: 在List对象上添加公共setter是危险的。 但它没有列出危险的原因 。 这就是我很好奇的部分。 如果我们有这个集合: public List Foos { get; set; } 为什么要将setter设为私有? 显然我们不希望客户端代码替换集合, 但如果客户端可以删除每个元素,然后添加他们想要的东西,那么重点是什么? 这与完全替换系列不一样吗? 遵循此代码分析规则如何提供价值?

为什么java中的嵌套类与C#中的嵌套类在以下方面不同?

我发现了几个类似这样的post,但是找不到一个能够解释这个问题的答案。我已经执行了一个类的嵌套,即类’inside’出现在类’outside’中并试图实例化内部类,这是我遇到的情景 在C#的情况下: class outside { public class inside { public void print() { System.Console.WriteLine(“I am inside”); } } } class Program { public static void Main(string[] args) { /* here i am trying to instantiate the inner class ‘inside’ */ outside.inside obj = new outside.inside(); obj.print(); Console.ReadKey(); } } 输出: 我在里面所以,上面的工作正常。但是, 在Java的情况下: class outside { […]