Tag: 构造函数

当两个重载具有相同的签名时,调用构造函数重载

考虑以下课程, class Foo { public Foo(int count) { /* .. */ } public Foo(int count) { /* .. */ } } 上面的代码无效,不会编译。 现在考虑以下代码, class Foo { public Foo(int count) { /* .. */ } public Foo(T t) { /* .. */ } } static void Main(string[] args) { Foo foo = new Foo(1); } 以上代码有效且编译良好。 […]

Initialize()vs Constructor()方法,正确用于创建对象

我们都从根本上知道Constructor和用户定义的Initialize()方法之间的区别。 我的问题集中在对象创建的最佳设计实践上。 我们可以将所有Initialize()代码放入Constructor() ,反之亦然(将所有预热代码移动到Initialize方法并从Constructor调用此方法)。 目前,在设计一个新类时,我在constructor()创建任何新实例,并将任何其他预热代码移动到Initialize()方法中。 您认为最好的权衡点是什么?

如果派生类inheritance了基类的私有成员,那么为什么不是构造函数呢?

我希望在c#中清楚地理解这个基本的OOPS概念。 在大多数Internet站点上,我读到派生类inheritance了基类的私有成员,但它无法访问这些成员。 派生类可以访问基类的public,protected,internal和protected内部成员。 即使派生类inheritance了基类的私有成员,它也无法访问这些成员。 但是,所有这些私有成员仍然存在于派生类中,并且可以执行与基类本身相同的工作。 例如,假设受保护的基类方法访问私有字段。 该字段必须存在于派生类中,以便inheritance的基类方法正常工作。 资料来源: http : //msdn.microsoft.com/en-us/library/ms173149.aspx 我的问题是,如果我们认为上面的内容是正确的,那么我们可以说“基类的构造函数是在派生类中inheritance的,但派生类只能使用base关键字通过自己的构造函数访问/调用它,并且这个构造函数不可用于外部世界在创建派生类的实例时“ 。 public class Employee { public int salary; public Employee(int annualSalary) { salary = annualSalary; } } public class Manager : Employee { public Manager(int annualSalary) : base(annualSalary) { //Add further instructions here. } } 因为要调用基类构造函数,它应该存在于该类中。 也许我的解释是错误的。 有人可以解释一下吗? 提前致谢!

我们可以在构造函数中断创建对象吗?

请问你能帮帮我吗。 我有一个想法但不知道如何实现它。 所以问题是:我们可以中断在构造函数中创建一个对象,即 //Code SomeClass someClass = new SomeClass(someCriteria); 因此,如果someCriteria没有回答我们的要求,我们不应该创建一个对象,而应该返回null,而不是新对象。 是否可以在C#中实现它?

通过基类创建派生类的实例,无需硬编码

我的问题如下: 我有一个需要抽象的基类。 它有几个派生类,每个派生类都有自己的特殊属性,这些属性包含在Properties成员中。 我需要能够创建这些派生类之一的新实例,以便所有成员都是等效的,但修改新实例不会修改原始实例。 最后,我想在不必在基类的每个派生类型中进行硬编码的情况下执行此操作。 (诚​​然,这将是最简单的解决方案,但这不是重点) 所有派生类都满足与基类的“is-a”关系。 这是代码: public abstract class BaseClass { //Default properties here int x, y, z, …; //Custom made class to hold custom properties protected Attributes Properties; public BaseClass createNewInstance() { return createNewInstanceStep1(); } //Each derived class implements their own version of this, //to handle copying any custom members contained in […]

仅通过构造函数设置类的属性

我试图使类的属性只能通过同一个类的构造函数设置。

这是“混蛋注射反模式”的一个很好的例子吗?

我看到首席开发人员编写这样的代码并在阅读Mark Seemann的书“.NET中的dependency injection”时,我想知道特定的“新”是否是“外来的”,因此“Bastard Injection”? public class SessionInitServiceManager { protected readonly ICESTraceManager _traceManager; protected readonly ILogger _logger; protected readonly IAggregateCalls _aggregator; protected readonly IMultiCoreRepository _repository; public SessionInitServiceManager(ICESTraceManager traceManager, ILogger logger, IAggregateCalls aggregator, IMultiCoreRepository repository) { _traceManager = traceManager; _logger = logger; _aggregator = aggregator; _repository = repository; } public SessionInitServiceManager() : this(new CESTraceManager(), new Logger(“BusinessServices.authenticateUser”), new […]

C#编译器奇怪与委托构造函数

基于以下问题 ,我发现了c#编译器的一些奇怪行为。 以下是有效的C#: static void K() {} static void Main() { var k = new Action(new Action(new Action(K)))); } 我发现奇怪的是编译器’解构’传递的委托。 ILSpy输出如下: new Action(new Action(new Action(null, ldftn(K)), ldftn(Invoke)).Invoke); 可以看出,它会自动决定使用委托的Invoke方法。 但为什么? 实际上,代码不清楚。 我们是否有一个三重包装的委托(实际)或内部委托只是’复制’到外部委托(我最初的想法)。 当然,如果意图就像编译器发出代码一样,那么应该写一下: var k = new Action(new Action(new Action(K).Invoke).Invoke); 与反编译代码类似。 任何人都可以certificate这种“令人惊讶的”转变的原因吗? 更新: 我只能想到一个可能的用例; 委托类型转换。 例如: delegate void Baz(); delegate void Bar(); … var k = […]

在C#中从类外部访问私有构造函数

如果我使用私有默认构造函数和具有参数的公共构造函数定义类,如何访问私有构造函数? public class Bob { public String Surname { get; set; } private Bob() { } public Bob(string surname) { Surname = surname; } } 我可以通过类上的静态方法访问私有构造函数,如下所示: public static Bob GetBob() { return new Bob(); } 我认为我可以通过扩展方法访问私有构造函数,因为(根据我的理解)扩展方法被翻译,以便它们看起来是类上的静态方法,但我不能: static class Fred { public static Bob Bobby(this Bob bob) { return new Bob(); } } 那么,我如何访问私有构造函数? 谢谢 编辑: […]

解决’构造函数中的虚方法调用’问题

我正在用c#制作一个软件。 我正在使用一个抽象类, Instruction ,它具有以下代码: protected Instruction(InstructionSet instructionSet, ExpressionElement newArgument, bool newDoesUseArgument, int newDefaultArgument, int newCostInBytes, bool newDoesUseRealInstruction) { //Some stuff if (DoesUseRealInstruction) { //The warning appears here. RealInstruction = GetRealInstruction(instructionSet, Argument); } } 和 public virtual Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) { throw new NotImplementedException(“Real instruction not implemented. Instruction type: ” + GetType()); } 因此,Resharper告诉我,在标记的行中,我“在构造函数中调用虚方法”并且这很糟糕。 […]