相关疑难解决方法(0)

struct vs class实现接口

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>'.存在显式转换(您是否错过了演员?)

为什么?
为什么类和结构之间有区别?任何解决方法?

c#

11
推荐指数
1
解决办法
396
查看次数

.NET自定义结构类型的内存开销是多少?

有一个与.NET对象相关的固定开销,在这个SO问题中有更全面的概述:.NET对象的内存开销是12或24字节,具体取决于你是在32位还是64位进程.

也就是说,类似的基本值类型int, double, boolean不会产生任何开销,因为它们是值类型.

struct在您的应用程序中放置自定义类型的位置在哪里?一方面,它们是int, double, boolean如上所述的价值类型[因此不应产生开销],但另一方面,它们间接地从中得到System.Object,因此(技术上)应该产生开销.

.net c# struct

11
推荐指数
2
解决办法
1636
查看次数

C#按值传递而不是按引用传递

请考虑以下代码(我有意将 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,以取代ab在全球范围内.

例:

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

9
推荐指数
2
解决办法
7759
查看次数

是C#中的datetime结构或类吗?

我刚刚开始使用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吗?

c# datetime

8
推荐指数
2
解决办法
4420
查看次数

结构 - 它的用途是什么?

我对struct类型有所了解.但我无法理解:它是为了什么?我什么时候用它?类,简单的值类型和枚举 - 这就是我所需要的.

有什么建议?

UPD:请!不要告诉我结构在堆栈中(我知道这个:).什么结构用于?

c# struct

7
推荐指数
3
解决办法
1432
查看次数

结构和类对象数组的内存分配

最后一天,我正在阅读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实例在数组中内联分配.这种优化可能被滥用.使用结构而不是类也可以使应用程序运行得更慢或占用更多内存,因为按值传递结构实例会导致创建该结构的副本.

问题: …

c# arrays value-type reference-type

7
推荐指数
2
解决办法
4683
查看次数

C#struct内存优化?

我接受了缓刑求职面试(?我不确定这是不是这个词),面试官让我告诉他结构和班级之间有什么区别.

所以我告诉了我所知道的一切以及我在msdn上读过的所有内容.

那家伙说"不够",我没有任何线索.所以他说:

结构是优化的,所以如果有和整数和浮点数,它们有一些相同的咬合,那么它将保存这个空间,所以struct with int=0float=0size的一半int=int.MAX,float=float.MIN.

好的.所以我很喜欢 - 没听说过.

但接下来,在采访之后我正在思考它并且它对我来说并没有多大意义.这意味着,当我们改变其中某个变量的值时,结构大小会有所不同.并且它不能真正存在于内存中,如果在扩展时发生碰撞会怎么样.而且我们必须写一些我们正在滑动的位,不确定它是否会给出任何优化.

另外,他在乞讨时问我,Java中的struct和class有什么不同.我已经回答过,Java中没有结构,他说"不是程序员,而是数字类型是结构"我有点像WTF.

基本上问题是:

这个家伙知道的是什么,这很难被了解(我的意思是,我在网上寻找它,找不到东西)

或许他对自己的工作一无所知,并试图在面试时看起来很酷.

c# java optimization struct memory-optimization

6
推荐指数
1
解决办法
527
查看次数

什么时候结构不在堆栈上?

我正在阅读Jon Skeet的书评,他正在审视Head First C#众多不准确之处.

其中一个引起了我的注意:

[在错误部分下]声称结构总是存在于堆栈中.

在什么情况下结构不会存在于堆栈中?这与我认为的结构相反.

c# stack struct

5
推荐指数
1
解决办法
655
查看次数

为什么 Task&lt;T&gt; 比 ValueTask&lt;T&gt; 更快?

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>返回任务对象时会导致更少的分配。

c# asynchronous task valuetask

5
推荐指数
1
解决办法
1529
查看次数

无法使用autofac注册结构实例

我刚开始从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# dependency-injection autofac

4
推荐指数
1
解决办法
703
查看次数