C#构造函数中的默认值与序列化的两个构造函数相同
当我为构造函数提供默认值 时 public MyClass(string description = null) { .... } 这等同于 public MyClass() { .... } public MyClass(string description) { .... } 序列化.换句话说,默认构造函数可用吗?实际上是,但是当我使用序列化时我会遇到一些问题吗? 解决方案 否.不幸的是,它不是默认的构造函数. 写作时: public MyClass(string description = null) { .... } 实际上,您正在制作一个接受字符串参数的构造函数,但具有标记该属性的默认值的属性.这与类上的默认构造函数不同. 其他解决方案 是的,在这种情况下您会遇到问题. 我尝试通过反射来调用您描述的构造函数,并抛出targetinvokationException :(参数计数不匹配).
2 2024-04-15
编程技术问答社区
如何简化多个构造函数?
我想拥有两个班级的构造函数,如下: public MyClass() { // do stuff here } public MyClass(int num) { MyClass(); // do other stuff here } 以上是实现我目的的正确方法吗?有某种更好的速记吗? 解决方案 public MyClass() { // do stuff } public MyClass(int num) : this () { // do other stuff with num } : this()位称为构造函数启动器. C#中的每个构造函数都有一个初始评估器,该初始评估在构造函数本身之前运行.默认情况下,初始评估器是基类的无参数构造函数(或Object,如果不能明确派生从另一个类派生).这样可以确保基类的成员在构建派生类的其余部分之前正确启动. 每个构造函数的默认构造函数可以通过两种方式覆盖.
0 2024-04-15
编程技术问答社区
调用泛型类的构造函数时的困境
我有这个看起来像这样的通用单例: public class Cache { private Dictionary cachedBlocks; // Constructors and stuff, to mention this is a singleton public T GetCache(Guid id) { if (!cachedBlocks.ContainsKey(id)) cachedBlocks.Add(id, LoadFromSharePoint(id)) return cachedBlocks[id]; } public T LoadFromSharePoint(Guid id) { return new T(id) // Here is the problem. } } 错误消息是:
0 2024-04-14
编程技术问答社区
这是否是 "Bastard injection anti-pattern "的一个好例子?
我看到首席开发人员编写这样的代码,然后阅读Mark Seemann的书" .NET中的依赖注入" 我想知道特定的"新" " ?? 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,
0 2024-04-14
编程技术问答社区
我怎样才能从构造函数中调用异步方法?
我需要从Form1构造器调用async方法.由于构造函数不能具有返回类型,因此我不能添加async void.我读到静态构造函数可以是async,但我需要从构造函数中调用不是static的方法,例如InitializeComponent()(因为它是表单的构造函数). 类是: public partial class Form1 : Form { InitializeComponent(); //some stuff await myMethod(); } 我阅读 this 但是我仍然不知道该如何实施此功能(就我而言),因为该方法仍然需要使用async. 解决方案 不要在构造函数中执行此操作,而是在窗口的加载事件中. 您可以将已加载的EventHandler标记为异步. 其他解决方案 您可以使用静态方法,该方法返回表单的实例 public class TestForm : Form { private TestForm
0 2024-04-14
编程技术问答社区
静态构造函数会导致性能开销?
最近在dotnetpearls.com 上阅读了此处打. 不能理解为什么? 解决方案 我认为"实质性"是最多用例中的一个夸大其词. 具有静态构造函数(即使它无能为力)会影响类型初始化时间,这是由于存在/不存在 Fieldinit Flag之前.当您拥有静态构造函数时,时间有更严格的保证. 对于大多数代码,我建议这不会有太大的不同 - 但是,如果您紧紧地循环并访问类的静态成员,则可能.就我个人而言,我不会太担心它 - 如果您怀疑它在您的 real 应用中相关,那么请测试它而不是猜测.微型基准很可能会夸大此处的效果. 值得注意的是,.net 4 其他解决方案 好吧,我刚刚复制了他的测试. 用于1000000000的迭代, debug 构建我得到: 4s静态阶段的静态课程 构造函 3.6s同一班级带有评论的静态构造函数 2.9s与类非静态(并在 迭代) 构造器与否 与版本相同 build do 突出显示差异: 带有静态构造函数的静态
0 2024-04-14
编程技术问答社区
解决'构造函数中的虚拟方法调用'问题
我正在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 GetRealInst
0 2024-04-14
编程技术问答社区
我们能否在构造函数中中断创建一个对象
你能帮我吗? 我有一个主意,但不知道该如何实施. 所以问题是: 我们可以中断在构造函数中创建对象吗 即. //Code SomeClass someClass = new SomeClass(someCriteria); 因此,如果somecriteria不回答我们的要求,我们不应该创建一个对象,而不是返回null而不是新对象. 是否可以在C#? 中实现它 解决方案 最佳方法是工厂课程,但是如果您的班级如此之小,则可以使用: class SomeClass { private string _someCriteria; private SomeClass(string someCriteria) { _someCriteria = someCriteria; } public static SomeClass CreateInstance
0 2024-04-14
编程技术问答社区
创建对象的最佳方式
这似乎是非常愚蠢和基本的问题,但我尝试使用Google,但找不到令人满意的答案, public class Person { public string Name { get; set; } public int Age { get; set; } public Person(){} public Person(string name, int age) { Name = name; Age = age; } //Other properties, methods, events... } 我的问题是,如果我有这样的课程,创建对象的最佳方法是什么? Person p=new Person("abc",15) 或 Person p=new Person(); p.Name="abc"; p.Age=15; 这两种方法之间有什么区别,创建对象的最佳方法是什么? 解决方案
0 2024-04-14
编程技术问答社区
一个构造函数应该有多少个变量?
我意识到这是一个非常开放的问题,可以得到各种各样的答案,但是这里是. 使用C#(或Java或任何OO语言),是否有一般规则指出应将多少变量传递到构造函数中?我传递到扩展类的构造函数的变量数量似乎已经失控了. 为了封装类的数据,我将成员私有,在构造函数中初始化并使用公共访问器. 这是一个示例: public class A { private int var1; private int var2; private int var3; //3 variables passed in public A(int v1, int v2, int v3) { var1 = v1; var2 = v2; var3 = v3; } //Properties (accessors) here } public class B : A { private int var4; private int var5;
0 2024-04-14
编程技术问答社区
在初始化一个懒惰的实例时,将参数传递给构造函数
public class myClass { public myClass(String InstanceName) { Name = InstanceName; } public String Name { get; set; } } // Now using myClass lazily I have: Lazy myLazy; Console.WriteLine(myLazy.Value.Name); 我的问题是我们使用懒惰实例时如何将InstanceName传递给myClass构造器? 解决方案 尝试以下方法: Lazy myLazy = new Lazy(() => new myClass(InstanceName)); 请记住,表达式是懒惰的,因此,如果您在称为构造函数之前更改变量InstanceName的值,则可能无法执行您的期望. 其他解决方案 懒惰
2 2024-04-14
编程技术问答社区
Initialize()与Constructor()方法,在创建对象时的正确用法
我们都知道Constructor和用户定义Initialize()方法的区别. 我的问题集中在对象创建的最佳设计实践上.我们可以将所有Initialize()代码放入Constructor()中,反之亦然(将所有热身代码移至Initialize方法,然后从Constructor中调用此方法). 当前,设计一个新类,我在constructor()内创建任何新实例,然后将任何其他热身代码移至Initialize()方法中. 您认为最好的权衡点是什么? 解决方案 我认为应该考虑多个方面: 构造函数应以在可用状态的方式初始化对象. 构造函数只能初始化对象,而不要执行重型工作. 构造函数不应直接或间接调用虚拟成员或外部代码. 因此,在大多数情况下,不需要初始化方法. 在初始化涉及的情况下,不仅将对象放入可用的状态(例如,当需要执行重型工作或虚拟成员或外部需要调用时),初始化方法是一个好主意. 其他解决方案 我发现自己最近在考虑这个问题
0 2024-04-14
编程技术问答社区
只通过构造函数设置类的属性
我正在尝试使只能通过同一类的构造函数设置的类的属性. 解决方案 使属性具有可读的备份字段: public class Thing { private readonly string _value; public Thing(string value) { _value = value; } public string Value { get { return _value; } } } 其他解决方案 Microsoft 描述如何仅从构造函数设置属性. 您可以通过两种方式制作不变的属性.您可以声明 设置访问者.该属性仅在 类型,但它是消费者不变的.您可以仅声明 Get登录器,除非 在类型的构造函数中. 在Visual Studio 2015随附的C#6.0中,有一个更改,可以从构造函数中设置仅获取属性.并且仅来自构造函数. 因此,代码可以简化为仅获取属性: public class Thing {
0 2024-04-14
编程技术问答社区
静态构造函数中出现异常
我已经四处逛逛,以解决这个问题,到目前为止,我能找到的最好的是在这里,但是这是针对静态构造函数的实例.我只在静态上使用课程. 我的代码: public static class MailHelper { private static string mailHost; static MailHelper() { var mailSettings = ConfigurationManager.GetSection("MailSettings") as NameValueCollection; if (null == mailSettings) { throw new ConfigurationErrorsException("Missing Mail Settings in the configuration file"); } mailHost = Configura
0 2024-04-14
编程技术问答社区
在发送至基础构造函数之前修改参数值
标题可能有些模棱两可,但是我想不出一种更好的方式. 我意识到在调用基本构造函数之前我无法调用派生的构造函数,但是我可以以某种方式修改/创建参数值,然后再将其传递给基地? 例如, public enum InputType { Number = 1, String = 2, Date = 3 } public class BaseClass { public BaseClass(InputType t) { // Logic } } public class DerivedClass : BaseClass { public DerivedClass(int i) : base(value) // Can I do something to infer what value should be here? { // Logic } } 如
0 2024-04-14
编程技术问答社区
我如何在一个从构造函数中调用的初始化方法中设置一个只读字段?
我敢肯定,我已经看到某个地方可以通过在我的init()方法上方使用属性来完成以下操作,该属性告诉编译器,必须从构造函数调用init()方法,从而允许要设置的ReadOnly字段.我忘记了属性的调用,我似乎在Google上找不到它. public class Class { private readonly int readonlyField; public Class() { Init(); } // Attribute here that tells the compiler that this method must be called only from a constructor private void Init() { readonlyField = 1; } } 解决方案 Rob的答案是在我的书中进行的.如果您需要初始化多个字段,则可以使用out参数进行操作:
0 2024-04-14
编程技术问答社区
C#中的抽象构造函数
可能的重复: 为什么不能创建我为什么不能创建抽象构造函数上的抽象c#类? 为什么我不能声明这样的班级的构造函数: public abstract class MyClass { public abstract MyClass(int param); } 解决方案 构造函数仅适用于定义的类,也就是说,它们不是继承的.使用基类构造函数(即使仅自动调用默认值,您也必须调用其中一个),但不能因派生类而覆盖.您可以在抽象基类上定义构造函数 - 不能直接使用它,但是可以通过派生类调用.您不能做的是强迫派生的类实现特定的构造函数签名. 为了定义所有派生类的构造函数,通常是在受保护的情况下定义的构造函数,这是完全合理的.当抽象类提供其他依赖此设置的其他默认行为时,也许是尤其如此.例如: public abstract class Foo { public string Name { get; private set; } protected
0 2024-04-14
编程技术问答社区
在C#中从另一个构造函数的主体中调用一个构造函数
我需要从另一个人的身体打电话给一个构造函数.我该怎么做? 基本上 class foo { public foo (int x, int y) { } public foo (string s) { // ... do something // Call another constructor this (x, y); // Doesn't work foo (x, y); // neither } } 解决方案 你不能. 您必须找到一种链接构造函数的方法,如: public foo (int x, int y) { } public foo (string s) : this(XFromString(s), YFromString(s)) { ... } 或将您的施工代码移至常见的设置方法中,例如: public foo (int x
0 2024-04-14
编程技术问答社区
C#中构造函数与对象初始化器的优先级
我最近一直在C#中学习对象初始化器,但是现在我想知道它与构造函数发生冲突时它是如何工作的. public class A { public bool foo { get; set; } public A() { foo = true; } public A(bool bar) { foo = bar; } } 当我尝试这个时会发生什么? public class B { private A a = new A() { foo = false }; private A b = new A(true) { foo = false }; } 构造函数中的默认值是使bool启动并可以更改的好方法? public A(bool bar = true) { foo = bar; } 解决方案 来自 documentation : 编译器通过首先访
0 2024-04-14
编程技术问答社区
是否可以创建构造器扩展方法? 如何创建?
是否可以添加构造函数扩展方法? 样品用例 我想添加一个list 构造函数以从给定的部分填充的缓冲区中接收特定数量的字节(没有仅复制相关字节等的开销): ... public static List(this List l, T[] a, int n) { for (int i = 0; i some_list = new List(my_byte_array,number_of_bytes); 我已经添加了一个addrange扩展方法: public static void AddRange(this List l, T[] a, int n) { for (int i = 0; i
0 2024-04-14
编程技术问答社区