相关疑难解决方法(0)

为什么我不能在.NET中为结构定义默认构造函数?

在.NET中,值类型(C#struct)不能包含没有参数的构造函数.根据这篇文章,这是CLI规范要求的.会发生什么,对于每个值类型,都会创建一个默认构造函数(由编译器?),它将所有成员初始化为零(或null).

为什么不允许定义这样的默认构造函数?

一个微不足道的用途是有理数:

public struct Rational {
    private long numerator;
    private long denominator;

    public Rational(long num, long denom)
    { /* Todo: Find GCD etc. */ }

    public Rational(long num)
    {
        numerator = num;
        denominator = 1;
    }

    public Rational() // This is not allowed
    {
        numerator = 0;
        denominator = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用当前版本的C#,默认的Rational 0/0并不是那么酷.

PS:默认参数是否有助于解决C#4.0或者是否会调用CLR定义的默认构造函数?


Jon Skeet回答道:

要使用您的示例,当有人执行时您希望发生什么:

 Rational[] fractions = new Rational[1000];
Run Code Online (Sandbox Code Playgroud)

它应该通过你的构造函数1000次?

当然应该,这就是我首先编写默认构造函数的原因.当没有定义显式默认构造函数时,CLR应该使用默认的归零构造函数; 这样你只需支付你使用的费用.然后,如果我想要一个1000个非默认Rational的容器(并希望优化1000个结构),我将使用一个 …

.net c# struct

242
推荐指数
6
解决办法
10万
查看次数

C#struct,如何分配空值?

我有一个清单:

List<int, SomeStruct>
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它不允许我为其分配空值.如果我想没有关联的结构,我该怎么办?

c# struct nullable

26
推荐指数
3
解决办法
5万
查看次数

限制在C#中使用结构

好吧,让我说我有一个像这样的结构A:

Struct A{
    private String _SomeText;
    private int _SomeValue;

    public A(String someText, int SomeValue) { /*.. set the initial values..*/ }

    public String SomeText{ get { return _SomeText; } }
    public int SomeValue{ get { return _SomeValue; } }
}
Run Code Online (Sandbox Code Playgroud)

现在我想要做的是返回结构A作为类ABC中的方法的结果,如下所示:

Class ABC{
    public A getStructA(){
        //creation of Struct A
        return a;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不希望任何程序员使用我的库(它将具有Struct A和Class ABC以及更多东西)来创建Struct A的实例.
我希望创建它的唯一方法是作为返回来自getStructA()方法.然后可以通过适当的getter访问这些值.

那么有什么方法可以设置这样的限制吗?那么一个结构不能在某个类之外实例化?使用C#,.Net4.0.

谢谢你的帮助.

---编辑:----
添加一些细节我为什么要实现这个目标:

  • 我的班级ABC有一些人可以查询的"状态".此状态有2个字符串值,然后是长整数列表.
  • 从来没有必要由程序员创建"状态"的对象/实例,状态只能由类的"getStatus()"函数返回.
  • 我不想将这3个字段拆分为不同的方法,因为要获取它们我正在调用Windows API(p/invoke),它返回所有3个字段的类似结构.
  • 如果我确实要将它拆分为3个方法而不使用struct,那么每次调用这3个方法中的一个时,我都必须缓存结果或从Windows API调用该方法...

所以我可以创建一个公共结构,程序员可以根据需要实例化它,这对他们来说没用,因为没有方法可以接受它作为参数.或者我可以以这样的方式构造库:只有当从方法返回时,才能获得此结构(或者如果它使事情变得更容易将其更改为类).

c# struct data-structures c#-4.0

2
推荐指数
1
解决办法
251
查看次数

如何防止使用默认构造函数?

我们正在创建一个简单的结构,其中构造函数接受一个参数.

public struct test
{
    public int val;

    public test (int a)
    {
        val = a;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我注意到可以使用默认构造函数初始化结构.这可以预防吗?

test t1 = new test();   //why does this work?
Run Code Online (Sandbox Code Playgroud)

c#

0
推荐指数
1
解决办法
127
查看次数

标签 统计

c# ×4

struct ×3

.net ×1

c#-4.0 ×1

data-structures ×1

nullable ×1