相关疑难解决方法(0)

643
推荐指数
15
解决办法
33万
查看次数

数组,堆和堆栈以及值类型

int[] myIntegers;
myIntegers = new int[100];
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,是新的int [100]在堆上生成数组吗?从我通过c#读到的CLR,答案是肯定的.但我无法理解的是,数组中的实际int会发生什么.由于它们是值类型,我猜它们必须被装箱,因为我可以,例如,将myIntegers传递给程序的其他部分,如果它们一直留在堆栈上它会使堆栈混乱.还是我错了?我猜他们只是盒装,并且只要数组存在就会活在堆上.

c# memory arrays heap stack

129
推荐指数
4
解决办法
5万
查看次数

结构是"价值传递"吗?

我最近试图为一个Vector2字段创建一个属性,只是意识到它不能按预期工作.

public Vector2 Position { get; set; }
Run Code Online (Sandbox Code Playgroud)

这阻止我改变其成员的价值(X&Y)

查看有关此内容的信息,我读到为Vector2struct 创建属性只返回原始对象的副本而不是引用.

作为Java开发人员,这让我很困惑.

C#中的对象何时按值传递,何时通过引用传递?
是否所有struct对象都按值传递?

c# struct pass-by-value

33
推荐指数
4
解决办法
2万
查看次数

内存中可存储的可空类型?

这可能是关于可空类型的问题的后续问题.

哪些可以为空的值类型(int?...)存储在内存中?首先,我认为它很清楚,Nullable<T>结构和那些是值类型.然后我找到了Jon Skeet的文章" Memory in .NET ",其中说:

请注意,值类型变量永远不能具有null值 - 它没有任何意义,因为null是引用类型概念,意味着"此引用类型变量的值根本不是对任何对象的引用" .

阅读本声明后,我有点困惑.所以,让我说我有int? a = null;.由于int通常是值类型,是它在某种程度上内部存储结构Nullable<T>在堆栈(我用"正常",因为我不知道值类型会发生什么,当它变成可为空)?或者其他任何事情发生在这里 - 也许在堆中?

.net c# nullable

32
推荐指数
2
解决办法
7105
查看次数

C#中的不可变类型和属性

C#中的不可变类型和不可变属性是什么意思?你能举一个简单的例子吗?

c# types immutability

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

为什么在列表<>中添加新值会覆盖列表<>中的先前值

我实际上是在尝试将多个项目添加到列表中,但最后所有项目都具有与最后一项相同的值.

public class Tag
{
    public string TagName { get; set; }
}

List<Tag> tags = new List<Tag>();
Tag _tag = new Tag();
string[] tagList = new[]{"Foo", "Bar"};

foreach (string t in tagList)
{
    _tag.tagName = t; // set all properties
    //Add class to collection, this is where all previously added rows are overwritten
    tags.Add(_tag);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码生成两个项目的列表,TagName当我期望一个"Foo"和一个时,设置为"Bar" "Bar".为什么所有项目在结果列表中具有相同的属性?

解释为什么更改public class Tagpublic struct Tag使此代码按预期工作(不同的项具有不同的值)的加分点.


如果重要的是我的实际目标是创建派生集合类,但由于问题只发生在列表中,它可能是可选的,仍然显示我的目标在下面.

按照一些教程,我可以成功创建一个集合类,它继承了创建DataTable所需的功能,可以将其作为表值参数传递给Sql Server的存储过程.一切似乎都运作良好; 我可以添加所有行,它看起来很漂亮.但是,经过仔细检查,我注意到当我添加一个新行时,所有前一行的数据都会被新行的值覆盖.因此,如果我有一个字符串值为"foo"的行,并且我添加了第二行,其值为"bar",则将插入第二行(使用两行的DataTable),但这两行的值都为"bar" ".任何人都可以看到为什么会这样?下面是一些代码,它们可以工作但是有点简化(Tag类已经减少了以便于解释).

以下是Collection类:

using …
Run Code Online (Sandbox Code Playgroud)

c#

18
推荐指数
1
解决办法
3万
查看次数

为什么不允许复制构造函数按值传递?

可能重复:
为什么复制构造函数应该通过C++中的引用接受其参数?
可以将对象作为值传递给复制构造函数

考虑一下这段代码:

class complex{
        private:
                double re, im;
        public:
                complex(double _re, double _im):re(_re),im(_im){}
                complex(complex c):re(c.re),im(c.im){}
};
Run Code Online (Sandbox Code Playgroud)

编译时,我收到一条错误消息: invalid constructor; you probably meant ‘complex (const complex&)’

在书中C++ Programming Language,写道:

复制构造函数定义了复制的含义 - 包括复制参数的含义 - 所以写作

complex:complex(complex c):re(c.re),im(c.im){} //错误

是一个错误,因为任何调用都会涉及无限递归.

为什么这会导致无限递归?这没有意义.

c++ constructor

17
推荐指数
2
解决办法
2万
查看次数

参数参数有什么不好?

我遇到的情况我认为只能通过使用ref参数来解决.但是,这意味着当我只需要5%的ref参数提供的功能时,将方法更改为始终接受ref参数.

这让我觉得"哇,疯了,必须找到另一种方式".我是傻瓜吗?ref参数可能导致哪些问题?

编辑

要求提供进一步的细节,我不认为它们与我的要求完全相关,但我们走了.

我想要保存一个新实例(将使用以后可能使用的ID进行更新)或检索与某些逻辑匹配的现有实例并更新它,保存它然后更改新实例的引用以指向现有的.

代码可能会更清晰:

protected override void BeforeSave(Log entity)
{
    var newLog = entity;

    var existingLog = (from log in repository.All()
                           where log.Stuff == newLog.Stuff 
                                 && log.Id != newLog.Id
                           select log).SingleOrDefault();

    if (existingLog != null)
    {
        // update the time
        existingLog.SomeValue = entity.SomeValue;
        // remove the reference to the new entity
        entity = existingLog;
    }
}

// called from base class which usually does nothing before save
public void Save(TEntity entity)
{
    var report = validator.Validate(entity);

    if (report.ValidationPassed) …
Run Code Online (Sandbox Code Playgroud)

c# oop

14
推荐指数
3
解决办法
5570
查看次数

C#,甚至需要通过引用传递对象吗?

我试图刷新我对 C# 的理解。我之前使用过 Java,通过引用传递是我在 Java 中真正怀念的强大工具。但是,我需要澄清是否需要通过引用传递对象,以及是否有可能有帮助的场景?Stackoverflow 已经有多个关于引用的问题,它们确实很有启发性,但是,我想知道是否有通过引用传递对象的方案。让我附上代码以更好地说明它。

class Program
    {
        public static void Update(int x) { x++; }
        public static void Update(ref int x) { x++; }
        public static void Update(Employee x) { x.msalary += 2000; }
        public static void Update(ref Employee x) { x.msalary += 2000; } //Do we even need this method? Is there a scenario where we might need this?

        static void Main(string[] args)
        {

            int a = 0;

            Update(a);
            Console.WriteLine("T1  " + a.ToString()); //a is still …
Run Code Online (Sandbox Code Playgroud)

c# pass-by-reference

3
推荐指数
1
解决办法
324
查看次数

如何在 C# 中向动作添加另一个动作?

为什么这段代码只会打印“A”和“B”,而不是“C”?

Action act = null;
act += () => MessageLog.Message("A");
act += () => MessageLog.Message("B");
Action<Action> add = a => a += () => MessageLog.Message("C");
add(act);
act.Invoke();
Run Code Online (Sandbox Code Playgroud)

c# delegates

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

int是值类型还是引用类型?

为什么我一直听到int是引用类型,但我看到int是一个struct.并且struct是一种价值类型.谢谢.

c#

0
推荐指数
2
解决办法
3715
查看次数