private static void TestStructInterface()
{
IFoo foo1 = new FooClass(); // works
IFoo foo2 = new FooStruct(); // works
IEnumerable<IFoo> foos1 = new List<FooClass>(); // works
IEnumerable<IFoo> foos2 = new List<FooStruct>(); // compiler error
}
interface IFoo
{
string Thing { get; set; }
}
class FooClass : IFoo
{
public string Thing { get; set; }
}
struct FooStruct : IFoo
{
public string Thing { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
无法将类型'System.Collections.Generic.List <Tests.Program.FooStruct>'隐式转换为'System.Collections.Generic.IEnumerable <Tests.Program.IFoo>'.存在显式转换(您是否错过了演员?)
为什么?
为什么类和结构之间有区别?任何解决方法?
有一个与.NET对象相关的固定开销,在这个SO问题中有更全面的概述:.NET对象的内存开销是12或24字节,具体取决于你是在32位还是64位进程.
也就是说,类似的基本值类型int, double, boolean不会产生任何开销,因为它们是值类型.
struct在您的应用程序中放置自定义类型的位置在哪里?一方面,它们是int, double, boolean如上所述的价值类型[因此不应产生开销],但另一方面,它们间接地从中得到System.Object,因此(技术上)应该产生开销.
请考虑以下代码(我有意将 MyPoint编写为此示例的引用类型)
public class MyPoint
{
public int x;
public int y;
}
Run Code Online (Sandbox Code Playgroud)
它是普遍公认的(至少在C#中)当你通过引用传递时,该方法包含对被操作对象的引用,而当你通过值传递时,该方法复制被操纵的值,因此全局范围中的值是不受影响.
例:
void Replace<T>(T a, T b)
{
a = b;
}
int a = 1;
int b = 2;
Replace<int>(a, b);
// a and b remain unaffected in global scope since a and b are value types.
Run Code Online (Sandbox Code Playgroud)
这是我的问题; MyPoint是引用类型,所以我希望在相同的操作Point,以取代a与b在全球范围内.
例:
MyPoint a = new MyPoint { x = 1, y = 2 };
MyPoint b = new …Run Code Online (Sandbox Code Playgroud) c# value-type reference-type pass-by-reference pass-by-value
我刚刚开始使用c#.但无法弄清楚DateTime.我知道它是一个结构,但为什么我会看到不同的方法像类一样初始化它.
如果它是一个结构,这怎么样?
DateTime myValue = DateTime.Now; // This is struct
DateTime myValue2 = new DateTime(); // This is class with +11 overloads.
Run Code Online (Sandbox Code Playgroud)
那么c#one中有两个版本的datetime是struct而另一个是class吗?
我对struct类型有所了解.但我无法理解:它是为了什么?我什么时候用它?类,简单的值类型和枚举 - 这就是我所需要的.
有什么建议?
UPD:请!不要告诉我结构在堆栈中(我知道这个:).什么结构用于?
最后一天,我正在阅读C#参考,在那里我看到了一个声明.请看以下声明.
语境:
对于Point使用结构而不是类可以在运行时执行的内存分配数量有很大差异.下面的程序创建并初始化一个包含100个点的数组.将Point实现为类,实例化101个单独的对象 - 一个用于数组,一个用于100个元素.
class Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Test
{
static void Main() {
Point[] points = new Point[100];
for (int i = 0; i < 100; i++)
points[i] = new Point(i, i*i);
}
}
Run Code Online (Sandbox Code Playgroud)
如果将Point实现为结构,如
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
实例化只有一个对象 - 数组的对象.Point实例在数组中内联分配.这种优化可能被滥用.使用结构而不是类也可以使应用程序运行得更慢或占用更多内存,因为按值传递结构实例会导致创建该结构的副本.
问题: …
我接受了缓刑求职面试(?我不确定这是不是这个词),面试官让我告诉他结构和班级之间有什么区别.
所以我告诉了我所知道的一切以及我在msdn上读过的所有内容.
那家伙说"不够",我没有任何线索.所以他说:
结构是优化的,所以如果有和整数和浮点数,它们有一些相同的咬合,那么它将保存这个空间,所以struct with
int=0和float=0size的一半int=int.MAX,float=float.MIN.
好的.所以我很喜欢 - 没听说过.
但接下来,在采访之后我正在思考它并且它对我来说并没有多大意义.这意味着,当我们改变其中某个变量的值时,结构大小会有所不同.并且它不能真正存在于内存中,如果在扩展时发生碰撞会怎么样.而且我们必须写一些我们正在滑动的位,不确定它是否会给出任何优化.
另外,他在乞讨时问我,Java中的struct和class有什么不同.我已经回答过,Java中没有结构,他说"不是程序员,而是数字类型是结构"我有点像WTF.
基本上问题是:
这个家伙知道的是什么,这很难被了解(我的意思是,我在网上寻找它,找不到东西)
或许他对自己的工作一无所知,并试图在面试时看起来很酷.
我正在阅读Jon Skeet的书评,他正在审视Head First C#的众多不准确之处.
其中一个引起了我的注意:
[在错误部分下]声称结构总是存在于堆栈中.
在什么情况下结构不会存在于堆栈中?这与我认为的结构相反.
Task<T>我正在对和进行基准测试ValueTask<T>。源代码如下:
#LINQPad optimize+ // Enable compiler optimizations
void Main()
{
Util.AutoScrollResults = true;
BenchmarkRunner.Run<TaskAndValueTaskComparsion>();
}
[ShortRunJob]
public class TaskAndValueTaskComparsion
{
[Benchmark]
public ValueTask<int> RunValueTaskWithNew()
{
return new ValueTask<int>(1);
}
[Benchmark]
public Task<int> RunTaskFromResult()
{
return Task.FromResult(1);
}
}
Run Code Online (Sandbox Code Playgroud)
对于结果来说,Task<T>比 快得多ValueTask<T>。但为什么?我真的希望ValueTask<T>返回任务对象时会导致更少的分配。
我刚开始从Unity迁移到Autofac,我在尝试注册实例时遇到了问题.
public static void Register(ContainerBuilder containerBuilder,
CancellationToken shutDownCancellationToken)
{
containerBuilder.RegisterType<CancellationToken>();
containerBuilder.RegisterInstance(shutDownCancellationToken);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
类型'
CancellationToken'必须是引用类型才能T在泛型类型或方法中使用它作为参数'RegistrationExtensions.RegisterInstance<T>(ContainerBuilder, T)'
任何人都知道如何注册已经创建的结构实例?
c# ×10
struct ×4
value-type ×2
.net ×1
arrays ×1
asynchronous ×1
autofac ×1
datetime ×1
java ×1
optimization ×1
stack ×1
task ×1
valuetask ×1