我有一个类,其中一个字段需要在初始化对象时初始化,例如需要在对象添加/删除之前创建的列表.
public class MyClass1
{
private List<MyOtherClass> _otherClassList;
public MyClass1()
{
this._otherClasslist = new List<MyOtherClass>();
}
}
public class MyClass2
{
private List<MyOtherClass> = new List<MyOtherClass>();
public MyClass2()
{
}
}
Run Code Online (Sandbox Code Playgroud)
这两个类有什么区别,为什么你会选择一种方法而不是另一种呢?
我通常在构造函数中设置字段,就像在MyClass1中一样,因为我发现更容易在一个地方查看以查看在实例化对象时发生的所有事情,但是在任何情况下都更好地对像在MyClass2中一样直接初始化一个字段?
我正在使用DataContractSerializer将我的类序列化/反序列化为XML.一切正常,但在某些时候,我想为这些XML文件的格式建立一个独立于实际代码的标准模式.这样,如果在序列化过程中出现问题,我总是可以返回并检查标准模式应该是什么.或者,如果我确实需要修改模式,则修改是一个明确的决定,而不仅仅是稍后修改我的代码的影响.
此外,其他人可能正在编写其他可能不是基于.NET的软件,需要从这些XML文件中读取.我希望能够为他们提供某种模式的文档.
DataContract和XSD架构之间是否存在某种关系.有没有办法将类中的DataContract属性导出为XSD架构?
我有一个名为ICatalog如下所示的接口,其中每个接口ICatalog都有一个名称和一个基于Predicate<Item>函数返回项目的方法.
public interface ICatalog
{
string Name { get; }
IEnumerable<Item> GetItems(Predicate<Item> predicate);
}
Run Code Online (Sandbox Code Playgroud)
目录的特定实现可以链接到各种格式的目录,例如XML或SQL数据库.
使用XML目录,我最终将整个XML文件反序列化为内存,因此使用谓词函数测试每个项目并不会增加更多的开销,因为它已经在内存中.
然而,在SQL实现中,我宁愿不将数据库的全部内容检索到内存中,然后使用谓词函数过滤项目.相反,我想找到一种方法以某种方式将谓词传递给SQL服务器,或以某种方式将其转换为SQL查询.
这似乎是一个可以用Linq解决的问题,但我对它很陌生.我的界面应该返回IQueryable吗?我现在不关心如何实际实现我的ICatalog的SQL版本.我只是想确保我的界面将来允许它.
我想知道在一个只通过上下文(右键单击)菜单可供用户使用的软件中提供某些功能是否合理.似乎在我使用右键菜单的大多数软件中,总是使用快速方式来获取其他按钮或菜单提供的功能.
下面是我正在开发的UI的屏幕截图.右侧的树视图显示了用户的目录库.用户可以创建新目录,或在库中添加和删除现有目录.然后可以打开或关闭其库中的目录,或将其设置为只读.

屏幕截图显示了我为浏览器创建的上下文菜单.某些命令可以独立于任何特定目录(New,Add)执行.但是其他命令必须应用于特定选择的目录(关闭,打开,删除,只读,刷新,清理,重命名).
目前,窗口顶部的"目录"菜单看起来与此上下文菜单相同.然而,我认为这可能会让用户感到困惑,因为显示当前所选目录的树视图可能并不总是可见.用户可能已切换到"搜索"或"过滤器"选项卡,或者左窗格可能完全隐藏.
但是,我对更改UI非常犹豫,因此依赖于特定选定目录的命令只能通过上下文菜单使用.
我正在创建一个程序,用户可以选择创建自己的自定义属性,最终将显示在一个PropertyGrid.现在我不想用自定义编辑器的一塌糊涂,所以我只允许基本类型的属性(string,int,double,DateTime,bool等)的PropertyGrid已经具有内置的编辑器.
但是,我还想让用户选择创建多个选项属性,他们可以定义一个可能的值列表,这些值又会显示为下拉列表PropertyGrid.
当我Enum在我的代码中硬编码时,属性网格会自动将其属性显示enum为下拉列表.但是我可以在运行时创建和/或修改枚举,以便用户可以添加另一个属性选项,然后返回PropertyGrid并在下拉列表中查看它们的新选项吗?
更新
考虑到帕特里克的评论,我认为Enum在这种情况下,s不是正确的方法.那么我怎样才能使用字符串列表来填充项目中的下拉PropertyGrid菜单?这需要自定义编辑器吗?
我编写了一个.NET winforms应用程序,它使用辅助线程进行一些繁重的处理,将其进程传回UI线程.一切正常,表单显示进度,我还创建了一个取消按钮来中断处理线程.但是,当耗时的过程进入应用程序时,我的整个计算机都会慢下来.拖动窗口需要很长时间,并且在尝试在记事本中键入字母时甚至会有明显的延迟.
我假设我需要降低处理线程的优先级,和/或增加UI线程的优先级.这是正确的吗?现在两个线程都是普通优先级.
这跟下面一样容易吗?或者我还应该做些什么呢?
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
Run Code Online (Sandbox Code Playgroud)
我该如何改变优先顺序?我应该降低处理的优先级,还是提高UI的优先级,或两者兼而有之?到了什么环境?高于正常还是最高?
我正在编写一个编目应用程序,它解析并从文件中提取信息,并将每个文件中的信息存储在一个对象实例中.除了从文件中提取的数据外,对象还具有其他元数据属性(作者,标签,注释等),这些属性稍后将存储在单独的XML文件中.
从文件中提取数据是一个耗时的过程,所以我让它在一个单独的线程上运行.从文件中提取的属性将仅来自文件,因此具有[ReadOnly]属性以防止用户编辑它们.另一方面,元数据属性仅由用户填充,因此不是只读的.我允许用户通过PropertyGrid查看/编辑这些对象.
因此,如果提取过程在一个填充对象文件属性的线程上运行,那么让用户同时编辑元数据属性是否有任何危险?我试图决定是否应该使用模式接口来阻止用户在提取完成/取消之前做任何事情,或者使用非模态接口来允许它们在提取运行时继续工作.
当SelectedObject属性中的对象发生更改时,如何自动更新属性网格?我已经尝试在我的类中实现INotifyPropertyChanged,但属性网格实际上并没有在后台显示对象的新属性,直到我点击它.
我已经尝试直接订阅我的对象的PropertyChanged事件,并在调用它时调用PropertyGrid的Refresh()方法.但是我的一些房产是相关的.更改一个属性的含义可能会引发多个PropertyChanged事件.这似乎工作正常,但我仍然想知道是否有更简洁的方法通过DataBinding这样做.另外,我想在用户仅更新单个属性后避免多次使用控件Refresh.
那么有没有办法让PropertyGrid从PropertyChanged事件中刷新?
c# data-binding propertygrid inotifypropertychanged winforms
初始化控件的属性或与表单I相关的其他值时,在初始化Form的构造函数中的值之间来回切换,然后在引发Form.Load事件时.
Forms构造函数与它的Form.Load事件的普遍接受使用是什么?对于其他类,我会在构造函数中进行所有初始化.然而,在VS中双击一个Form时,它会跳转到Form.Load事件的事件处理程序而不是构造函数.这让我相信在Load事件而不是构造函数之后进行所有初始化是更可取的.
我正在尝试在Visual Studio 2010中的当前项目上开始使用单元测试.但是,我的类结构包含许多接口和抽象类继承关系.
如果两个类是从同一个抽象类或接口派生的,那么我希望能够在它们之间共享测试代码.我不确定该怎么做.我想我为每个要测试的接口创建了一个测试类,但我不确定将具体类提供给适用的单元测试的正确方法.
更新
好的,这是一个例子.假设我有一个接口IEmployee,它由一个抽象类Employee实现,然后由两个具体的类Worker和Employee继承.(代码如下)
现在说我想创建适用于所有IEmployees或Employees的测试.或者为特定类型的员工创建特定测试.例如,我可能想断言将IEmployee.Number设置为小于零的数字,因为任何IEmployee实现都会引发异常.我更喜欢从任何IEmployee的角度编写测试,然后能够在IEmployee的任何实现上使用测试.
这是另一个例子.我可能还想断言,将任何员工的休假时间设置为小于零的值和错误.然而,我可能还希望有不同的测试适用于特定的Employee特定版本.假设我想测试如果工作人员提供超过14天的假期,那么工作人员会抛出异常,但最多可以提供36名经理.
public interface IEmployee
{
string Name {get; set;}
int Number {get; set;}
}
public abstract class Employee:IEmploee
{
string Name {get; set;}
int Number {get;set;}
public abstract int VacationTime(get; set;)
}
public abstract class Worker:IEmployee
{
private int v;
private int vTime;
public abstract int VacationTime
{
get
{
return VTime;
}
set
{
if(value>36) throw new ArgumentException("Exceeded allowed vaction");
if(value<0)throw new ArgumentException("Vacation time must be >0");
vTime= value;
}
}
public …Run Code Online (Sandbox Code Playgroud) c# ×8
.net ×5
propertygrid ×2
winforms ×2
constructor ×1
data-binding ×1
datacontract ×1
enums ×1
field ×1
inheritance ×1
interface ×1
iqueryable ×1
linq ×1
properties ×1
schema ×1
unit-testing ×1
xsd ×1