访问被重写的方法
有一个练习以下代码的输出将是什么: class Foo { public virtual void Quux(int a) { Console.WriteLine("Foo.Quux(int)"); } } class Bar : Foo { public override void Quux(int a) { Console.WriteLine("Bar.Quux(int)"); } public void Quux(object a) { Console.WriteLine("Bar.Quux(object)"); } } class Baz : Bar { public override void Quux(int a) { Console.WriteLine("Baz.Quux(int)"); } public void Quux(params T[] a) { Conso
0 2024-04-21
编程技术问答社区
如何使用泛型来实现这一功能?
我在使用.NET仿制药方面没有经验.我正在为.NET 4.0中设计一个软件系统和投资控股公司.该公司拥有零售业务和知识分子业务.书店和Audiocdshop是零售业务的示例. InginedSignPatent和BenzolmedicinePatent是知识分子业务的例子.这两种业务类型完全无关. 投资公司有一个名为InvestmentReturn的概念.这是从每个业务中获得的利润.对于每种"业务类型"(零售业,知识分子),计算逻辑在投资回报方面都是不同的. 我需要通过计算每种"业务类型"的投资来创建一个投资电视计算器. public static class InvestmentReturnCalculator { public static double GetNetInvestementReturn(List allMyProfitableBusiness, List
0 2024-04-21
编程技术问答社区
抽象类是接口的一种吗?
在我的/接口文件夹中,我都放置了所有接口. 抽象类是一种界面类型? 解决方案 在C#中,接口与类(甚至抽象类)不同. 接口只能定义API(方法签名,事件声明,属性声明),而不是实现(字段,方法主体等) 您只能继承一个基类,但是您可以实现多个接口 但是它们在某些用法中具有相似之处 - 例如,在抽象出厂实施中使用时. 其他解决方案 描述技术差异的答案是正确的,但还有更多.还有一个语义差异. 接口和抽象类之间的区别在于,接口代表做某事的能力,而抽象类表示一类对象的共同点. iDisposable界面表示"我知道如何处理我的重要资源"的概念;这是对象可以做的事情,而不是对象是. 相比之下,如果您要制作抽象类动物,那将代表所有动物的共同特征.世界上没有任何物体是"动物"的,而没有一些更具体的动物 - 金毛猎犬,国王鲑鱼,狮子等.我们通过使班级抽象来表示这一事实. 其他解决方案 否.有几个区别.主要区别在于,抽象类中可以有实现细节.一个类
0 2024-04-21
编程技术问答社区
C# 在类的构造函数中分配类的属性,有什么好处吗?
例如,如果我有这样的课程: namespace Sample { public Class TestObject { private Object MyAwesomeObject = new MyAwesomeObject(); } } 设置它是否有任何好处,以便将属性设置在构造函数中? namespace Sample { public Class TestObject { private Object MyAwesomeObject; public TestObject() { MyAwesomeObject = new MyAwesomeObject() } } } 解决方案 这两个是(几乎)相同的. 定义初始化程序时: private Object MyA
0 2024-04-21
编程技术问答社区
C#:将派生类作为一个通用参数来传递
我最近开始了解有关事件/代表的更多信息,并结合了班级的扩展. 我想通过将扩展名方法添加到Windows表单控件中的SetDraggable()> MouseDown又使用MouseDown>和MouseMove事件来移动控件来将我学到的知识介绍为实践周围. 所有人都可以正常工作,除了它仅适用于特定控件的想法 - 在我的情况下是Button. namespace Form_Extensions { public static class Extensions { private static System.Windows.Forms.Button StubButton; private static Point MouseDownLocation; public static void SetDraggable(this System.Windows.Forms.Button b) {
0 2024-04-21
编程技术问答社区
在类声明中初始化对象与构造函数的区别
我正在经历对象的对象初始化和构造函数初始化,但无法完全回复我的问题. case1和case2在这里有什么区别; 案例1: namespace ConsoleApplication2 { class MyBuilder { private MySynchronizer m_synchronizer = new MySynchronizer(); public MyBuilder() { } public void ProcessRecord(int recordNumber) { m_synchronizer.Process(recordNumber); } } } 案例II: namespace ConsoleApplication2 { class MyBuilder {
0 2024-04-21
编程技术问答社区
检查var是否是任何种类的对象的列表
我正在开发一个使用.NET Framework 4.6.1和C#的应用程序. 我想这样做: var val = actionArguments[key]; if (val is List as class) 我想检查val是否是任何形式的对象的List,但该语句不编译. 如何检查是否将变量声明为VAR是列表? 我的应用程序上的var是List. Code是我所做的自定义类. List是System.Generic.Collections. 解决方案 由于List也正在实现非生成IList接口,因此您可以简单地检查 if (val is IList) 这并不是说一个人可以假设IList的任何东西都是List.但是,在OP的情况下,有一些索引器返回object,并且需要在特定类型(也许是已知)类型之间有所不同,避免GetType()并依靠is IList就足够好为此目的. 参见 msdn 其他解决方案
0 2024-04-21
编程技术问答社区
为什么我们要实现接口?
实现接口只需提供该方法的骨架即可.如果我们知道该方法的确切签名线,则在这种情况下 实现接口的要求是什么? 实现了接口 的情况 interface IMy { void X(); } public class My:IMy { public void X() { Console.WriteLine("Interface is implemented"); } } 这种情况尚未实现 public class My { public void X() { Console.WriteLine("No Interface is implemented "); } } My obj = new My(); obj.X(); 两种方法都会产生相同的结果. 实现接口的要求是什么? 解决方案 .net中有两个继承的目的: 允许派生的类共享共同功能的基础类实现 允许将衍生的类对象
0 2024-04-21
编程技术问答社区
如何让一个枚举在它的每个条目上存储额外信息?
我有一组有信息的项目.这些项目是由我,程序员定义的,并且用户永远不需要更改它们,它们永远不需要根据配置进行更改,而它们唯一可能更改的时间是我应用程序的未来版本.我以前知道应该有多少个项目,以及它们的确切数据是多少. 枚举,是一个很棒的编程结构,可以让我预先定义我的应用程序中可用的一组密钥,并以逻辑类型进行分组. 我现在需要的是一种构造,让我预先定义一组钥匙,这些密钥附有附有额外信息的键. 示例: 这是标准枚举: public enum PossibleKeys { Key1, Key2, Key3 } 这是我需要的枚举: public enum PossibleItems { Item1 { Name = "My first item", Description = "The first of my possible items." }, Item2 {
0 2024-04-21
编程技术问答社区
C# : 在GET/SET属性上为一个类创建事件
每次设置我的班级中的财产时,我都希望解雇活动.每当设置其中一个属性时,我都希望能够触发同一事件.我有(大约12个) 即. public class MyClass { private int _myHeight; private int _myWidth; public int myHeight { get { return myHeight; } set { myHeight = value; //This fires event! } } public int myWidth { get { return myWidth; } set { myWidth = value; //This will fire the same event! } 我本身并不陌生,而是创建事件的新手.我一直使用Windows应用程序中使用的"开箱即用"事件.有什么想法吗? 解决方
0 2024-04-21
编程技术问答社区
利斯科夫替换原理、前提条件和抽象方法
liskov替代原则(LSP)说: 不能以亚型来加强前提. 在C#中,我可以违反以下整个原则: public class A { public virtual void DoStuff(string text) { Contract.Requires(!string.IsNullOrEmpty(text)); } } public class B : A { public override void DoStuff(string text) { Contract.Requires(!string.IsNullOrEmpty(text) && text.Length > 10); } } 但是,如果A.DoStuff将是abstract方法: public class A { public abstract void DoSt
0 2024-04-21
编程技术问答社区
ASP.NET MVC: 这个业务逻辑应该放在哪里?
我正在研究我的第一个真实MVC应用程序,并且正在尝试遵循OOP一般的最佳实践.我正在将控制器中的一些简单业务逻辑重构到我的域模型中.我最近一直在做一些阅读,很明显,我应该将逻辑放在域模型实体类中,以避免"贫血域模型"反图案. 该申请将允许人们购买停车位的租赁.费率取决于现场的长度以及客户是否是商业公园的成员. 所以我的域模型中有实体类,看起来像这样(简化): public class Customer { int ID { get; set; } string Name { get; set; } bool IsMember { get; set; } } public class ParkingSpace { int ID { get; set; } int Length { get; set; } } public class ParkingSpaceLease { int ID { get; set; }
0 2024-04-21
编程技术问答社区
委托人的封装问题?
我想知道为什么会起作用? 例如,我有一些 executor class 看起来像: public class Executor { public void Execute(Action action) { action(); } } 现在我有一些需要执行看起来像: 的类 public class NeedToBeExecuted { public void Invoke() { Executor executor = new Executor(); executor.Execute(DoSomething); } private void DoSomething() { // do stuff private } } 我的问题是为什么这是工作是我通过私有方法 其他类? 这不是封装问题吗? 解决方案 否,这不是违反封
0 2024-04-21
编程技术问答社区
什么样的访问修改器可以应用于一个类?
经过一番研究,我确定您可以应用于类的唯一访问修饰符是: public - 在任何集会中可用 内部 - 仅在当前组件中可用 但是下面的错误消息似乎意味着,如果某个类是不是在名称空间中定义的,则可以将其定义为 private , >或受保护的内部. 公共和内部是您可以在课堂上使用的唯一类修饰符,还是有更多? using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test2343434 { class Program { static void Main(string[] args) { Tools.ToolManager toolManager = new Tools.ToolManager(); Console.ReadLine(
0 2024-04-21
编程技术问答社区
在不修改原始类的情况下访问一个类的保护字段
我正在使用某种公开某种类型的第三方库(通过方法返回). 这种类型具有我感兴趣的一些受保护的领域,但是我无法使用它们,因为它们的可见性是受保护的. . 这是问题的简化: public class A { protected object Something; public A Load() { return new A(); } } public class ExtendedA : A { public void DoSomething() { // Get an instance. var a = Load(); // Access protected fields (doesn't compile). a.Somethi
0 2024-04-21
编程技术问答社区
使用Interface的优势是什么?
使用接口有什么用? 我听说它是​​使用的,而不是多个继承,并且可以使用数据隐藏. 还有其他优势,在哪里使用了界面,程序员如何识别需要接口? explicit interface implementation和implicit interface implementation? 有什么区别 解决方案 要解决隐式/明确的问题,假设两个不同的接口具有相同的声明: interface IBiographicalData { string LastName { get; set; } } interface ICustomReportData { string LastName { get; set; } } 您有一个实现两个接口的类: class P
0 2024-04-21
编程技术问答社区
如何在泛型类中映射一个默认的LINQ表达式
我有一个通用Repo类,可以公开数据库LINQ提供商: class Repo where T : IPersisted { IQueryable Get() { return _queryable; } } (IPersisted是持久对象的简单标记接口). 现在...我想找到一种优雅的方法来注入某些派生类型IPersisted的默认LINQ表达式.例如,对于以下息肉实现: class Deletable : IPersisted { bool IsDeleted { get; set; } } 我想要IQueryable Get()方法才能返回_queryable.Where(q => !q.IsDeleted),仅当T是类型Deletable的情况下. 我考虑过创建某种类型的字典映射IDictionary,并在Get方法内进行查找,但我不确定在这种情况
0 2024-04-21
编程技术问答社区
强制方法从基类调用基方法
如果我正在使用" Override"属性创建方法,则派生的方法不会自动调用基本方法,我需要使用这样的"基本"关键字手动称其为: public class A { public virtual void Say() { Console.Write("A"); } } public class B : A { public override void Say() { base.Say(); Console.Write("B"); } } 因此,只有在这种情况下,字符串" A"和" B"才会写入控制台.因此,问题是我如何摆脱" base.say()";线?因此,我想强制每种派生的方法"说"来调用基类的基本方法.是否可以?我正在寻找任何解决方案,即使我将被迫使用其他关键字 解决方案 尽管无法直接实现这一目标,但您可以通过编写自己的方法而不是虚拟的方法来获得相同的效果,该方法在执行了
0 2024-04-21
编程技术问答社区
如何在C#中使用部分方法来扩展现有实现
如果这会起作用,那就太好了.我是否试图以错误的方式实施我的想法? 我想使用部分方法,能够扩展现有代码,并简单地插入/输出方法. 基本上,完全是什么 部分方法使课堂设计师能够提供方法钩, 与活动处理程序类似,开发人员可以决定实施或 不是.如果开发人员不提供实施,则编译器 在编译时删除签名. 我第一次尝试使用此信息: defutionsbase.cs: namespace ABC { public partial class Definitions { // No implementation static partial void TestImplementaion(); } } deinutionsext.cs: namespace ABC { public partial class Definitions { static partial void TestImpleme
0 2024-04-21
编程技术问答社区
虚拟类中的抽象方法
我有一个具有许多虚拟方法的C#类,其中一些方法本质上是抽象的(它们在子类中完全实现,基类是空的). 为了使其编译,我在基类中扔了一个无效的exception,并评论了应该做的事情.这感觉很肮脏. 有更好的设计我的课程吗? 编辑: 它是针对将在加拿大运行的应用程序的中间层,其中一半的方法是通用的.一半的方法是特定于省的. Public class PersonComponent() { public GetPersonById(Guid id) { //Code to get person - same for all provinces } Public virtual DeletePerson(Guid id) { //Common code } Public virtual UpdatePerson(Person p) { throw new InvalidOperation("I wanna be abstract"); }
0 2024-04-21
编程技术问答社区