我有一个Windows窗体应用程序,当前在启动时加载数据库.流程是这样的:
Program.cs => Application.Run(new MainForm()); => MainForm构造函数=>打开数据库
所以基本上MainForm包含使应用程序运行的所有部分,而Program.cs只是一个存根.目前,加载的数据库的名称是硬编码的,我想添加功能以指定要通过命令行加载的数据库的名称.同时,我想添加稍后进行单元测试甚至依赖注入的能力,所以我想知道推荐哪种方法?
Application.Run(new MainForm());相应的方法一似乎更干净,因为它允许测试运行器使用测试数据库创建MainForm,但由于我通常不是WinForms开发人员,我不知道是否可能存在没有默认构造函数的副作用主要表格还是有更好的方法?
除了第一个参数的类型之外,我有一堆静态方法都具有相同的签名,例如:
public static class ElementCreators
{
public static XmlElement CreateElementForString
(string s, string name, string namespaceURI)
{
[...]
}
public static XmlElement CreateElementForDecimal
(Decimal d, string name, string namespaceURI)
{
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个Dictionary(或某种可以在运行时修改的查找 - 人们应该能够添加自己的func,但是一旦添加了func,就不需要修改/删除它,并且对于给定类型,永远不会有两个+ func.可能有基本和派生类型的函数,但在这种情况下,由用户注册它们,例如,按照正确的顺序)根据类型进行调度,例如:
var funcs = new Dictionary<Type, Func<object, string, string, XmlElement>>();
funcs[typeof(string)] = ElementCreators.CreateElementForString;
funcs[typeof(Decimal)] = ElementCreators.CreateElementForDecimal;
Run Code Online (Sandbox Code Playgroud)
现在,这不起作用,因为代理之间没有相反的变化,所以编译器抱怨这一点CS0123 No overload for 'CreateElementForString' matches delegate 'Func<object, string, string, XmlElement>'.
一种选择是创建另一个委托作为中间人:
funcs[typeof(string)] =
(o,s1,s2) => ElementCreators.CreateElementForString((string)o, s1, s2);
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是a)丑陋和b)介绍了一堆不必要的代表.
泛型似乎不是一个选项,因为Func不能是开放类型T.同样,动态不起作用,但我不想使用这些(运行时成本).
我可以为每个方法引入一个间接级别,这避免了委托,但它并没有那么难看:
public static XmlElement CreateElementForString(object …Run Code Online (Sandbox Code Playgroud) 我正在写一个WebPart,这意味着我继承System.Web.UI.WebControls.WebParts.WebPart并且我重写了该方法protected override void CreateChildControls().
但是,sealed如果可能的话,我想创建这个类,但这会产生两个问题:只是密封类会给出一个警告"在密封类中声明的新受保护成员".
将访问修饰符更改protected为private或internal给出编译器错误,告诉我在继承时无法更改修饰符.
这让我感到疑惑:密封它并忽略警告是否有任何问题?或者这会导致任何进一步的负面影响吗?它似乎工作得很好,但魔鬼通常在细节.
编辑:我只是愚蠢."新受保护的成员"错误是针对一个确实未被覆盖的函数,并且只是意外声明为protected.感谢Pragma-Tip!
我正在开发一个小博客软件,我想在帖子上附上标签.每个帖子可以有0到无限的标签,我想知道是否可以在不加入表格的情况下做到这一点?
由于标签的数量不受限制,我不能只创建n个字段(Tag1到TagN),因此另一种方法(显然是StackOverflow采用的方法)是使用一个大文本字段和分隔符,即"<Tag1> <与Tag2> <TAG3>".
那里的问题:如果我想显示带有标签的所有帖子,我将不得不使用"赞'%<Tag2>%'"语句,那些AFAIK可以不使用任何索引,需要全表扫描.
有没有合适的方法来解决这个问题?
注:我知道,一个单独的标签,链路表提供的好处,我应该可能没有测量等.我更感兴趣的是不同的方式来设计一个系统,担心性能.
我试图解决以下问题但无法找到一个优雅的解决方案.有任何想法吗?谢谢.
输入 - 可变长度的数字串,例如,字符串str ="5557476374202110373551116201";
任务 - 检查(从左到右)每个数字(忽略重复)不会出现在以下2个索引中.使用例如.上面,第一个数字= 5.忽略代表我们看到组中最后一个5的索引是2.所以我们检查接下来的2个索引,即3和4不应该有5.如果是,我们将其视为错误.目标是计算字符串中的此类错误.
在上面的字符串中,错误位于索引3,10和16处.
我想编写我的第一个真正的MultiThreaded C#应用程序.虽然之前我使用过BackgroundWorker并且知道关于lock(对象)的一两件事,但我从未使用Thread对象,Monitor.Enter等等,而我完全迷失了从哪里开始设计架构.
基本上我的程序在后台运行.每隔5分钟,它会检查一个Web服务.如果Web服务返回数据,它将从此数据中创建作业并将其传递给JobQueue.JobQueue然后按顺序处理这些作业 - 如果添加新作业但仍在处理作业时,它将对作业进行排队.此外,还有一个Web服务器允许远程访问该程序.
我看到它的方式,我需要4个线程:
程序启动时应创建线程2-4,程序结束时应该结束,因此它们只运行一次.
如上所述,我真的不知道架构将如何工作.线程1会做什么?当MyProgram类被实例化时,它是否应该具有Queue<Job>属性?我该如何开始我的线程?据我所知,我需要将一个函数传递给线程 - 该函数应该放在哪里?如果我有一个类"MyJobQueueThreadClass"具有线程3的所有函数,那么如何访问MyProgram类上的Object?如果一个线程只是一个函数,我该如何阻止它提前结束?如上所述,线程2等待5分钟,然后执行一系列功能,并一遍又一遍地重启5分钟计时器(Thread.Sleep(300)?),直到我的程序结束(调用Thread.Abort(Thread2)in MyProgram的关闭/退出/解析器?)
如果我创建自己的自定义iOS应用程序(XCode/Objective-C),我可以将它支持我选择的AirPlay和光束scren内容到Apple TV吗?
我在寻找什么API /函数调用?
我知道ASP.net中的web.config解析器不是一个合适的XML解析器,并且在一些有效的XML构造上失败了,但我想知道反之亦然:
(有效)web.config文件是否始终是有效的XML文件,因此可由XML解析器读取?
(我需要以编程方式操作它们,并且更喜欢使用XPath,但这需要有效的XML文档)
.net ×5
c# ×5
architecture ×2
airplay ×1
asp.net ×1
database ×1
ios ×1
objective-c ×1
sql-server ×1
string ×1
web-config ×1
winforms ×1
xml ×1