.NET中struct和class之间有什么区别?
使用new运算符创建类的实例时,将在堆上分配内存.当您使用new运算符创建结构的实例时,在堆上还是堆栈上分配内存?
我的理解是现在允许结构中的无参数构造函数.
但是下面的代码在VS 2015社区中给出了编译错误
public struct Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age) { Name = name; Age = age; }
public Person() : this("Jane Doe", 37) { }
}
Run Code Online (Sandbox Code Playgroud)
错误:"结构不能包含显式无参数构造函数"
谁知道为什么?
是否可以在c#中隐藏用户的无参数构造函数
我想强制他们总是使用带参数的构造函数
例如这个职业课程
public struct Position
{
private readonly int _xposn;
private readonly int _yposn;
public int Xposn
{
get { return _xposn; }
}
public int Yposn
{
get { return _yposn; }
}
public Position(int xposn, int yposn)
{
_xposn = xposn;
_yposn = yposn;
}
}
Run Code Online (Sandbox Code Playgroud)
我只希望用户能够通过指定x和y坐标来新建位置
但是,无参数构造函数始终可用
我不能把它私有化.甚至将其定义为公开
我已经读过这个 为什么我不能在.NET中为结构定义默认构造函数?
但它并没有真正的帮助
如果这是不可能的 - 检测我被传递的位置是否具有值的最佳方法是什么?
明确检查每个属性字段?有一种更光滑的方式吗?
谢谢
public struct Test
{
public double Val;
public Test(double val = double.NaN) { Val = val; }
public bool IsValid { get { return !double.IsNaN(Val); } }
}
Test myTest = new Test();
bool valid = myTest.IsValid;
Run Code Online (Sandbox Code Playgroud)
上面给出了valid==true因为没有调用默认arg的构造函数,并且使用标准默认值val = 0.0创建了对象.
如果结构是一个类,那么行为就是valid==false我所期望的.
我发现这种行为上的差异,特别是结构案例中的行为令人惊讶和不直观 - 发生了什么?stuct构造的默认arg服务是什么? 如果它无用为什么要让这个编译?
更新:澄清这里的重点不在于行为是什么 - 而是为什么在没有警告的情况下进行编译并且行为不直观.即如果没有应用默认的arg,因为在新的Test()情况下没有调用构造函数,那么为什么要让它编译?
是否可以设置或覆盖结构的默认状态?
作为一个例子,我有一个
enum something{a,b,c,d,e};
Run Code Online (Sandbox Code Playgroud)
以及为该枚举链接2个值的结构
struct SomethingData
{
something type;
int Value;
double Multipler;
SomethingData(something enumVal, int intVal, double DblVal) {...}
}
Run Code Online (Sandbox Code Playgroud)
但是我可以指定默认状态
SomethingData(something.c,0,1);
Run Code Online (Sandbox Code Playgroud) 我需要有关结构的建议.
我有两段代码.第一部分如下:
namespace Project.GlobalVariables
{
class IOCard
{
struct InputCard
{
public string CardNo;
public int BaseAddress;
public int LowerAddress;
public int UpperAddress;
public int[] WriteBitNo = new int[16];
public int[] ReadBitNo = new int[16];
}
static InputCard[] InputCards = new InputCard[5];
public static string ACardNo = InputCards[1].CardNo;
public static string BCardNo = InputCards[2].CardNo;
}
}
Run Code Online (Sandbox Code Playgroud)
第二部分如下:
private void Form1_Load(object sender, EventArgs e)
{
IOCard.ACardNo = "Card A";
IOCard.BCardNo = "Card B";
MessageBox.Show(IOCard.ACardNo);
MessageBox.Show(IOCard.BCardNo);
}
Run Code Online (Sandbox Code Playgroud)
我的计划是能够InputCards使用IOCard如下所示分配和检索组件 …
我使用结构传递给非托管DLL,因为 -
[StructLayout(LayoutKind.Sequential)]
public struct valTable
{
public byte type;
public byte map;
public byte spare1;
public byte spare2;
public int par;
public int min;
public byte[] name;
public valTable()
{
name = new byte[24];
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将无法编译,因为VS 2005会抱怨"Structs不能包含显式无参数构造函数".为了将这个结构传递给我的DLL,我必须像这样传递一个struct数组valTable[] val = new valTable[281];
我想说的是,当我说new,构造函数被调用并且它创建了一个像我试图演示的字节数组,因为DLL正在寻找每个维度中大小为24的字节数组.
我怎么能做到这一点?
该程序在C++中编译和运行,但不是Java和C#等多种语言.
#include <iostream>
using namespace std;
void foo2() {
cout << "foo 2.\n";
}
void foo() {
return foo2();
}
int main() {
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Java中,这给出了编译器错误,如'Void方法无法返回值'.但由于被调用的方法本身就是一个void,因此它不返回值.我知道为了便于阅读,可能会禁止这样的结构.还有其他异议吗?
编辑:为了将来的参考,我在这里发现了一些类似的问题return-void-type-in-c-and-c 我个人认为这个问题还没有回答.回复'因为它在规范中这样说,继续'不会削减它,因为有人必须首先编写规范.也许我应该问'允许返回像C++这样的void类型有什么优缺点'?
我研究了这个主题,但我找不到任何重复.我想知道为什么你可以struct在数组中使用a 而不创建它的实例.
例如,我有一个class和一个struct:
public class ClassAPI
{
public Mesh mesh { get; set; }
}
public struct StructAPI
{
public Mesh mesh { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当ClassAPI在阵列中使用时,它必须与所述初始化new能够使用其属性和方法之前的关键字:
ClassAPI[] cAPI = new ClassAPI[1];
cAPI[0] = new ClassAPI(); //MUST DO THIS!
cAPI[0].mesh = new Mesh();
Run Code Online (Sandbox Code Playgroud)
但事实并非如此StructAPI.看起来好像StructAPI不必在数组中初始化:
StructAPI[] sAPI = new StructAPI[1];
sAPI[0].mesh = new Mesh();
Run Code Online (Sandbox Code Playgroud)
如果你尝试同样的事情ClassAPI,你会得到一个NullReferenceException.
在阵列中使用它们时,为什么它与结构不同?
我理解上的差异之间class,并struct用struct …