我想检查一个实体是否已添加到数据库中.那么,我怎么能看到a
和之间的这种差异b
?
var a = dataContext.Things.First(x => x.Name == something);
var b = new Thing { Name = something };
Run Code Online (Sandbox Code Playgroud)
为了更清楚,如果我有这个:
var thing = dataContext.Things.FirstOrDefault(x => x.Name == something)
?? new Thing { Name = something };
Run Code Online (Sandbox Code Playgroud)
如何查看是否thing
需要插入?
下面的实现是否是线程安全的?如果不是我错过了什么?我应该在volatile
某个地方有关键字吗?或者在OnProcessingCompleted
方法的某个地方锁定?如果是的话,在哪里?
public abstract class ProcessBase : IProcess
{
private readonly object completedEventLock = new object();
private event EventHandler<ProcessCompletedEventArgs> ProcessCompleted;
event EventHandler<ProcessCompletedEventArgs> IProcess.ProcessCompleted
{
add
{
lock (completedEventLock)
ProcessCompleted += value;
}
remove
{
lock (completedEventLock)
ProcessCompleted -= value;
}
}
protected void OnProcessingCompleted(ProcessCompletedEventArgs e)
{
EventHandler<ProcessCompletedEventArgs> handler = ProcessCompleted;
if (handler != null)
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我有私有事件和显式接口的原因是因为它是一个抽象基类.从它继承的类不应该直接对该事件做任何事情.添加了类包装器,使其更清晰=)
我在某些地方看到过这种代码:
public event SomeEventHandler SomeEvent = (s, e) => { };
Run Code Online (Sandbox Code Playgroud)
这是一种推荐的做事方式吗?它解决了什么,是否有任何值得注意的副作用?我还需要做空检查吗?或者这正是我不必再做的了?垃圾收集仍然可以正常工作吗?
例如:
private PropertyChangedEventHandler propertyChanged;
private readonly object propertyChangedLock = new object();
public event PropertyChangedEventHandler PropertyChanged
{
add
{
lock (propertyChangedLock)
propertyChanged += value;
}
remove
{
lock (propertyChanged)
propertyChanged -= value;
}
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler;
lock (propertyChangedLock)
handler = propertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)
我可以将第一行更改为:
private PropertyChangedEventHandler propertyChanged = (s, e) => { };
Run Code Online (Sandbox Code Playgroud)
然后跳过OnPropertyChanged方法中的空值检查?如果我然后跳过空检查我可以跳过锁吗?如果是这样会给我这个:
protected void OnPropertyChanged(string propertyName) …
Run Code Online (Sandbox Code Playgroud) 我只创建了常规的Windows应用程序(主要是C#).Windows服务与常规Windows应用程序的区别是什么?是什么让他们不同?应用程序无法提供哪些服务?从开发人员的角度看有哪些不同之处?你是如何创造一个的?它只是创建一个常规应用程序(可能是控制台应用程序,因为没有gui?)并以特殊方式运行或安装它,还是需要做更多的事情?
假设你有两个人Control
,爱丽丝和鲍勃,你想交换他们的位置.我的意思是交换后:
ControlCollection
,那么Alice应该拥有Bob的索引,反之亦然.ControlCollection
s中,Alice应该具有与Bob相同的索引,但是在Bobs中ControlCollection
,反之亦然.你会怎么做?由于ControlCollection
方法的工作原理,我有点不确定如何最好地解决这个问题.例如,使用Remove
删除控件的方法将更改集合中后面的所有控件的索引.SetChildIndex以类似的方式工作.
编辑: Alice和Bob的父控件是流布局面板.这就是为什么我要交换它们的索引,这将有效地在流布局面板中交换它们的位置.
我在Codeplex上托管了几个项目.因为当我创建TFS时,除了TFS之外我什么都不知道,我使用了它.但是,现在我对TortoiseSVN和VisualSVN感到更舒服,所以我想用它来代替.
当然,使用subversion获取我的项目是没有问题的.问题是项目中有TFS绑定.我怎样才能删除这些?一步一步的指南会很好.
所以你不必想知道我有什么工具:我可以使用Visual Studio中的TFS Explorer和TortoiseSVN连接到项目.我也安装了TFS电动工具,所以如果需要我也可以使用它们.
我递归地遍历一堆目录.其中一些(如D:\ $ RECYCLE.BIN\S-1-5-20)给了我一个System.UnauthorizedAccessException
.我想我可以抓住它并继续前进,但我宁愿提前弄明白.
所以,当我有一个DirectoryInfo
对象时.我怎么能看到我是否被允许GetDirectories()
并且可能被允许Delete()
?
我正在考虑如何测试多线程的东西,但不太确定如何开始.我相信如果我能把事情搞定,我会更容易找到更多的东西,所以我想知道是否有人可以帮助我为这个简单的类编写一个NUnit测试用例:
class Worker
{
public event EventHandler<EventArgs> Done = (s, e) => { };
public void StartWork()
{
var thread = new Thread(Work) { Name = "Worker Thread" };
thread.Start();
}
private void Work()
{
// Do some heavy lifting
Thread.Sleep(500);
Done(this, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试的只是:Done
事件完成时是否会引发事件.如果它是同步的话我会没有问题,但是当它不是时,我不知道哪里开始.一个简单的测试,如果它不是多线程的(并且该Work
方法不是私有的)可能是:
[TestFixture]
class WorkerTests
{
[Test]
public void DoWork_WhenDone_EventIsRaised()
{
var worker = new Worker();
var eventWasRaised = false;
worker.Done += (s, e) => eventWasRaised = true;
worker.Work();
Assert.That(eventWasRaised);
}
} …
Run Code Online (Sandbox Code Playgroud) 假设我们有一个如下所示的方法:
public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
if(subjects == null)
throw new ArgumentNullException("subjects");
foreach(var puppy in puppies)
yield return puppy.Grow();
}
Run Code Online (Sandbox Code Playgroud)
如果我通过这样做测试:
Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll());
Run Code Online (Sandbox Code Playgroud)
测试将失败说它
预期:
<System.ArgumentNullException>
但是:null
我可以通过改变测试来解决这个问题
Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll().ToArray());
Run Code Online (Sandbox Code Playgroud)
这通常是你通常会这样做的吗?或者有更好的方法来编写测试吗?或者也许是一种更好的方法来编写方法本身?
尝试使用内置Select
方法做同样的ToArray
事情,即使没有或类似的事情它也失败了,所以显然你可以做些什么......我只是不知道:p
当在互联网和手册中看到SQL代码时,似乎有很多用于表示字符串的东西(或者至少是我认为他们做的那些?).
使用",","或"之间有什么区别吗?它们是否完全相同?或者它们中的一些是否具有特殊含义?某些情况下是否应该使用某些情况?其他情况下是否应该使用?这里的交易是什么?
c# ×8
events ×2
nunit ×2
codeplex ×1
collections ×1
comparison ×1
controls ×1
datacontext ×1
directory ×1
exception ×1
linq-to-sql ×1
mysql ×1
string ×1
svn ×1
tfs ×1
windows ×1
winforms ×1