假设我有以下类和结构定义,并将它们作为字典对象中的键使用:
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是一个值类型,这意味着它实际上包含在其中定义的数据成员.Class是一种引用类型,意味着它包含对其中定义的数据成员的引用.
方法签名按值传递参数,这意味着值的副本将传递到方法内部,这使得大型数组和数据结构的代价很高.
我不明白的是当我调用一个方法时会发生什么,实际发生了什么.是否会调用new()?它只是自动复制数据吗?或者它实际上只是指向原始对象?使用ref和out如何影响这个?
在参考此MSDN页面(或关于此事项的任何相关页面)时,它指出:
使用键盘更改焦点时,焦点事件按以下顺序发生:
- 输入
- 的GotFocus
- 离开
- 证实
- 验证
- 引发LostFocus
但是,当您使用鼠标来引发事件时,订单会发生变化!
使用鼠标或通过调用Focus方法更改焦点时,焦点事件按以下顺序发生:
- 输入
- 的GotFocus
- 引发LostFocus
- 离开
- 证实
- 验证
这不会使事件链完全不同吗?我的解释是键盘链确保一切正常,然后引发LostFocus事件.然而,鼠标事件似乎在出于某种原因进行验证之前提高了它.这是为什么?
我在理解容器/组件模型如何在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 …
我需要创建一个将两个字典包装在一起的类,以便可以通过int或string的键来检索它们的值.
属性似乎是最好的方法,但这两种实现之间有区别吗?
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#编写一个简单的角色扮演游戏,以便更熟悉该语言.
我有一个类从CSV文件加载数据,创建一个对象,并将其放在字典中.因为游戏的每个方面都有不同的数据(项目,演员,技能等),所以我将每个方面都设置为一个类,但这需要我为每个方面重新实现一个Load()方法.在做了5到6次之后,我想知道是否有更好的方法来实现它.
基本上,我想要做的是解析包含标题的CSV的第一行,并将它们用作类变量名.目前,它们是作为字典关系实现的,所以我会做SomeClassInstance.dict ["id"],理想情况下我会输入SomeClassInstance.id,它完全是根据文件的内容生成的.
那是一件事吗?我该怎么做呢?
我正在阅读有关Partial关键字的MSDN文章,这部分引起了我的注意:
partial关键字表示可以在命名空间中定义类,结构或接口的其他部分.所有部分都必须使用partial关键字.所有部件必须在编译时可用,以形成最终类型.所有部件必须具有相同的可访问性,例如public,private等.
[...]
指定基类的所有部分必须一致,但省略基类的部分仍然继承基类型.部件可以指定不同的基接口,最终类型实现所有部分声明列出的所有接口.在部分定义中声明的任何类,结构或接口成员都可用于所有其他部分.最后的类型是编译时所有部分的组合.
关于这个概念我有两个问题:
首先,似乎这是一种绕过C#中缺少多重继承的方法(当然除了接口).除了正常的多重继承问题,例如钻石问题,这样做是否会产生任何影响?基本上,仅仅因为我可以,这是否意味着我应该?
其次,我什么时候应该拆分文件?通过阅读本文,我觉得我应该能够在自己的文件中声明一个嵌套类,并将其与包含的类一起分开,从而提高可读性.这是Partial的要点,还是仅应按照上述文章中的描述使用?
我想要做的是有一个方法,将泛型类型作为带有约束的参数.但是,约束的类型也有第二种泛型类型,但我希望该方法能够工作,无论第二次输入是什么:
public class IEvent<T> where T : EventArgs { }
public class EventManager
{
public void DoMethod<T>() where T: IEvent<???>
{
}
}
Run Code Online (Sandbox Code Playgroud)
具体来说,我试图让我的EventManager班级接受任何类型的活动,然后用它做点什么.我是在过度复杂化,还是可行的?
这究竟是如何工作的?
如果我有这个基类
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会发生什么?虽然知道发生了什么是好的,但我也对它为什么这样工作感兴趣.
我正在尝试制作一个简单的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# ×10
casting ×1
class ×1
components ×1
csv ×1
dictionary ×1
downcast ×1
dynamic ×1
enumeration ×1
equality ×1
events ×1
generics ×1
getter ×1
lost-focus ×1
parameters ×1
properties ×1
struct ×1
types ×1
winforms ×1