小编Kyl*_*ran的帖子

使用类与struct作为字典键

假设我有以下类和结构定义,并将它们作为字典对象中的键使用:

public class MyClass { }
public struct MyStruct { }

public Dictionary<MyClass, string> ClassDictionary;
public Dictionary<MyStruct, string> StructDictionary;

ClassDictionary = new Dictionary<MyClass, string>();
StructDictionary = new Dictionary<MyStruct, string>();
Run Code Online (Sandbox Code Playgroud)

为什么这有效:

MyClass classA = new MyClass();
MyClass classB = new MyClass();
this.ClassDictionary.Add(classA, "Test");
this.ClassDictionary.Add(classB, "Test");
Run Code Online (Sandbox Code Playgroud)

但是这会在运行时崩溃:

MyStruct structA = new MyStruct();
MyStruct structB = new MyStruct();
this.StructDictionary.Add(structA, "Test");
this.StructDictionary.Add(structB, "Test");
Run Code Online (Sandbox Code Playgroud)

它表示密钥已经存在,正如预期的那样,但仅适用于结构.该类将其视为两个单独的条目.我认为这与作为参考与价值的数据有关,但我想更详细地解释原因.

c# struct dictionary equality class

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

通过引用和值传递对象

在深入研究设计课程之前,我只想检查一下我对C#处理事物的方式的理解.我目前的理解是:

  • Struct是一个类型,这意味着它实际上包含在其中定义的数据成员.
  • Class是一种引用类型,意味着它包含对其中定义的数据成员的引用.

  • 方法签名按传递参数,这意味着的副本将传递到方法内部,这使得大型数组和数据结构的代价很高.

  • 使用refout关键字定义参数的方法签名将通过引用传递参数,这意味着提供了指向对象的指针.

我不明白的是当我调用一个方法时会发生什么,实际发生了什么.是否会调用new()?它只是自动复制数据吗?或者它实际上只是指向原始对象?使用refout如何影响这个?

c# parameter-passing pass-by-reference pass-by-value

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

为什么LostFocus事件会在不同时间被调用?

在参考此MSDN页面(或关于此事项的任何相关页面)时,它指出:

使用键盘更改焦点时,焦点事件按以下顺序发生:

  1. 输入
  2. 的GotFocus
  3. 离开
  4. 证实
  5. 验证
  6. 引发LostFocus

但是,当您使用鼠标来引发事件时,订单会发生变化!

使用鼠标或通过调用Focus方法更改焦点时,焦点事件按以下顺序发生:

  1. 输入
  2. 的GotFocus
  3. 引发LostFocus
  4. 离开
  5. 证实
  6. 验证

这不会使事件链完全不同吗?我的解释是键盘链确保一切正常,然后引发LostFocus事件.然而,鼠标事件似乎在出于某种原因进行验证之前提高了它.这是为什么?

c# events lost-focus winforms

10
推荐指数
1
解决办法
1108
查看次数

使用System.ComponentModel

我在理解容器/组件模型如何在C#中相互交互时遇到了一些困难.我得到了Component如何包含一个Site对象,它包含有关Container和Component的信息.但是,假设我有以下代码:

using System;
using System.ComponentModel;

public class Entity : Container {
    public string Foo = "Bar";
}

public class Position : Component {
    public int X, Y, Z;    
    public Position(int X, int Y, int Z){
        this.X = X;
        this.Y = Y;
        this.Z = Z;
    }
}

public class Program {

    public static void Main(string[] args) {

        Entity e = new Entity();
        Position p = new Position(10, 20, 30);

        e.Add(p, "Position");            

    }    

}
Run Code Online (Sandbox Code Playgroud)

这没有问题,它定义了容器(实体)和包含在其中的组件(位置).

但是,如果我调用p.Site.Container它,它将返回Entity,但作为IContainer.也就是说,(Console.WriteLine(p.Site.Container as Entity).Foo);如果我想访问Foo …

c# components system.componentmodel

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

私有二传手或仅定义一个吸气剂有区别吗?

我需要创建一个将两个字典包装在一起的类,以便可以通过intstring的键来检索它们的值.

属性似乎是最好的方法,但这两种实现之间有区别吗?

public class Atlas<TValue>
{
    private Dictionary<int, TValue> _byIndex;
    private Dictionary<string, TValue> _byName;

    public Dictionary<int, TValue> ByIndex
    {
        get { return _byIndex; }
    }

    public Dictionary<string, TValue> ByName
    {
        get { return _byName; }
    }
}
Run Code Online (Sandbox Code Playgroud)

public class Atlas<TValue>
{
    public Dictionary<int, TValue> ByIndex { get; private set; }
    public Dictionary<string, TValue> ByName { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,字典对象都是不可变的,元素可以自由更改,这就是我想要的.但是,尝试更改字典对象将导致a ~ cannot be assigned to -- it is read only或a ~ cannot be …

c# getter properties getter-setter

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

在C#中创建动态变量名

我正在尝试用C#编写一个简单的角色扮演游戏,以便更熟悉该语言.

我有一个类从CSV文件加载数据,创建一个对象,并将其放在字典中.因为游戏的每个方面都有不同的数据(项目,演员,技能等),所以我将每个方面都设置为一个类,但这需要我为每个方面重新实现一个Load()方法.在做了5到6次之后,我想知道是否有更好的方法来实现它.

基本上,我想要做的是解析包含标题的CSV的第一行,并将它们用作类变量名.目前,它们是作为字典关系实现的,所以我会做SomeClassInstance.dict ["id"],理想情况下我会输入SomeClassInstance.id,它完全是根据文件的内容生成的.

那是一件事吗?我该怎么做呢?

c# csv design-patterns dynamic

5
推荐指数
2
解决办法
6467
查看次数

我什么时候应该使用Partial关键字?

我正在阅读有关Partial关键字的MSDN文章,这部分引起了我的注意:

partial关键字表示可以在命名空间中定义类,结构或接口的其他部分.所有部分都必须使用partial关键字.所有部件必须在编译时可用,以形成最终类型.所有部件必须具有相同的可访问性,例如public,private等.

[...]

指定基类的所有部分必须一致,但省略基类的部分仍然继承基类型.部件可以指定不同的基接口,最终类型实现所有部分声明列出的所有接口.在部分定义中声明的任何类,结构或接口成员都可用于所有其他部分.最后的类型是编译时所有部分的组合.

关于这个概念我有两个问题:

  • 首先,似乎这是一种绕过C#中缺少多重继承的方法(当然除了接口).除了正常的多重继承问题,例如钻石问题,这样做是否会产生任何影响?基本上,仅仅因为我可以,这是否意味着我应该

  • 其次,我什么时候应该拆分文件?通过阅读本文,我觉得我应该能够在自己的文件中声明一个嵌套类,并将其与包含的类一起分开,从而提高可读性.这是Partial的要点,还是仅应按照上述文章中的描述使用?

c# multiple-inheritance partial-classes

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

具有通用约束的通用方法

我想要做的是有一个方法,将泛型类型作为带有约束的参数.但是,约束的类型也有第二种泛型类型,但我希望该方法能够工作,无论第二次输入是什么:

public class IEvent<T> where T : EventArgs { }
public class EventManager
{
    public void DoMethod<T>() where T: IEvent<???>
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我试图让我的EventManager班级接受任何类型的活动,然后用它做点什么.我是在过度复杂化,还是可行的?

c# generics generic-method

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

当我进行一次垂头丧气时会发生什么?

这究竟是如何工作的?

如果我有这个基类

public class BaseClass
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }

    public BaseClass SimpleClone()
    {
        BaseClass result = new BaseClass();
        result.Value1 = this.Value1;
        result.Value2 = this.Value2;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

而这个孩子班

public class DerivedClass : BaseClass
{
    public bool Value3 { get; set; }

    public DerivedClass()
    {
        Value3 = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能向下转换BaseCast.SimpleClone()anotherObj?Value3会发生什么?虽然知道发生了什么是好的,但我也对它为什么这样工作感兴趣.

c# casting downcast

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

传递Enum作为参数

我正在尝试制作一个简单的Roguelike游戏,以便更好地学习C#.我试图制作一个通用的方法,我可以给它一个Enum作为参数,它将返回该枚举中有多少元素作为int.我需要让它尽可能通用,因为我将有几个不同的类调用该方法.

我在最后一个小时左右搜索了一下,但是我找不到任何资源或者其他方式完全回答了我的问题...我仍然处于C#的初级中级阶段,所以我仍在学习所有的事物的语法,但这是我到目前为止:

// Type of element
public enum ELEMENT
{
    FIRE, WATER, AIR, EARTH
}


// Counts how many different members exist in the enum type
public int countElements(Enum e)
{
    return Enum.GetNames(e.GetType()).Length;
}


// Call above function
public void foo()
{
    int num = countElements(ELEMENT);
}
Run Code Online (Sandbox Code Playgroud)

它编译时出现错误"Argument 1:无法从'System.Type'转换为'System.Enum'".我有点明白为什么它不起作用,但我只需要一些方向来正确设置一切.

谢谢!

PS:是否可以在运行时更改枚举的内容?程序正在执行?

c# parameters types enumeration

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