我有一个像这样定义的泛型方法:
public void MyMethod<T>(T myArgument)
Run Code Online (Sandbox Code Playgroud)
我想要做的第一件事是检查myArgument的值是否是该类型的默认值,如下所示:
if (myArgument == default(T))
Run Code Online (Sandbox Code Playgroud)
但是这不能编译,因为我没有保证T将实现==运算符.所以我把代码改为:
if (myArgument.Equals(default(T)))
Run Code Online (Sandbox Code Playgroud)
现在这个编译,但是如果myArgument为null则会失败,这是我正在测试的一部分.我可以像这样添加一个显式的空检查:
if (myArgument == null || myArgument.Equals(default(T)))
Run Code Online (Sandbox Code Playgroud)
现在这让我感到多余.ReSharper甚至建议我将myArgument == null部分更改为myArgument == default(T),这是我开始的地方.有没有更好的方法来解决这个问题?
我需要支持两种引用类型和值类型.
我有一个读取查询,我在一个事务中执行,以便我可以指定隔离级别.查询完成后,我该怎么办?
做每一个有什么含义?
using (IDbConnection connection = ConnectionFactory.CreateConnection())
{
using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted))
{
using (IDbCommand command = connection.CreateCommand())
{
command.Transaction = transaction;
command.CommandText = "SELECT * FROM SomeTable";
using (IDataReader reader = command.ExecuteReader())
{
// Read the results
}
}
// To commit, or not to commit?
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:问题不在于是否应该使用交易或是否有其他方法来设置交易级别.问题是,是否提交或回滚了不修改任何内容的事务.有性能差异吗?它会影响其他连接吗?还有其他差异吗?
从初学者到高级,您可以找到关于领域驱动设计的所有信息.
鉴于以下课程......
public abstract class FooBase<TBar> where TBar : BarBase{}
public abstract class BarBase{}
public class Bar1 : BarBase{}
public class Foo1 : FooBase<Bar1> {}
Run Code Online (Sandbox Code Playgroud)
......以及以下方法......
public TBar DoSomething<TFoo, TBar>(TFoo theFoo)
where TFoo : FooBase<TBar>
where TBar : BarBase
{
return default(TBar);
}
Run Code Online (Sandbox Code Playgroud)
为什么以下代码行不能表示返回类型?
Bar1 myBar = DoSomething(new Foo1());
Run Code Online (Sandbox Code Playgroud)
相反,我必须指定像这样的泛型类型......
Bar1 myBar = DoSomething<Foo1, Bar1>(new Foo1());
Run Code Online (Sandbox Code Playgroud) 我是Objective-C的新手,我无法弄清楚如何以非阻塞的方式等待.我有一个异步填充的对象,我需要等待它才能继续进行另一种方法.现在我正在使用sleep函数,但是这会阻止整个app并且myObject永远不会被加载.
while (!myObject)
{
sleep(1);
}
return myObject;
Run Code Online (Sandbox Code Playgroud)
编辑:此代码段来自可能在加载myObject之前调用的方法.在这种情况下,我实际上想要阻止此方法,但我的代码阻止包括myObject在内的所有内容被加载.
我有一个父/子关系映射多对多集.
public class Parent
{
public ISet<Child> Children { get; set; }
}
public class Child {}
public class ParentMap : ClassMap<Parent>
{
HasManyToMany(x => x.Children)
.AsSet();
}
Run Code Online (Sandbox Code Playgroud)
如何编写查询以选择包含给定子项的所有父项?我会猜到它会是这样的,但这个API不存在:
Session.CreateCriteria<Parent>()
.Add(Expression.Contains("Children", child)
.List<Parent>();
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活在任何地方找到答案.我的大脑今天没有完全运作,谷歌到目前为止还没有让我失望.
我有一个文本文件,我想逐行读取并记录文本文件中的位置.在读取文件的任何行后,程序可以退出,我需要在恢复时在下一行继续读取该文件.
以下是一些示例代码:
using (FileStream fileStream = new FileStream("Sample.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
fileStream.Seek(GetLastPositionInFile(), SeekOrigin.Begin);
using (StreamReader streamReader = new StreamReader(fileStream))
{
while (!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
DoSomethingInteresting(line);
SaveLastPositionInFile(fileStream.Position);
if (CheckSomeCondition())
{
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行这段代码时,fileStream.Position
读取每一行后,它的值不会改变,只有在读完几行后才会前进.当它发生变化时,它会以1024的倍数增加.现在我假设有一些缓冲正在进行,但我怎样才能记录文件中的确切位置?
我需要调用一些需要WS-Security的第三Web服务.我使用以下配置创建了一个WCF端点:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="TestBinding">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="TestBehavior">
<callbackDebug includeExceptionDetailInFaults="true" />
<clientCredentials>
<clientCertificate findValue="Acme" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="https://acme.com/webservices" binding="wsHttpBinding" bindingConfiguration="TestBinding" behaviorConfiguration="TestBehavior" contract="AcmeContract" name="AcmeEndpoint"></endpoint>
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
问题是第三方服务器抛出以下异常:
收到协议'_http://schemas.xmlsoap.org/wsdl/soap12/',必需的协议'_http://schemas.xmlsoap.org/wsdl/soap/'.
据我所知,使用wsHttpBinding将导致WCF发送SOAP 1.2请求,而使用basicHttpBinding将导致SOAP 1.1请求.由于WS-Security部分是必需的,据我所知,我必须使用wsHttpBinding.我的问题是如何强制SOAP 1.1请求?我有什么选择?
我正在使用ILMerge合并几个.NET程序集,包括一些第三方程序集.由于这样做,我遇到了几个错误,这些错误都归结为类型定义与它们所定义的程序集相关联的事实.
一个简单的例子是我的App.config中的log4net配置部分定义.它使用type ="log4net.Config.Log4NetConfigurationSectionHandler,log4net",由于log4net程序集合并到我的合并程序集后不存在,因此无效.不过没什么大不了的,我将程序集名称更改为我的合并程序集,它运行正常.
一个稍微复杂的例子是二进制序列化类型.我的系统使用二进制序列化在进程之间发送某些对象.所有可序列化对象都在一个所有其他项目都引用的公共程序集中定义.我使用的是默认的二进制序列化,但在反序列化对象时出现失败,错误表明它无法找到序列化对象的合并程序集.同样,没什么大不了的,我实现了一个自定义的SerializationBinder,它在任何加载的程序集中查找类型,而不仅仅是给定的类型.
当序列化类型引用其他可序列化类型时,前面的示例变得更加复杂.我继续遇到越来越多越来越难以处理的问题.
我试图在这里得到的一点是,.NET类型系统和ILMerge似乎并不能很好地协同工作.有没有人对他们如何解决这个问题有任何经验?是否有可能告诉.NET运行时我不关心它应该是什么类型的程序集,只需在任何地方查找它?
注意:请不要回答询问为什么我要合并程序集,这不是这个问题的重点.
假设我有以下代码:
public class Foo
{
private int x;
private int y;
public Bar CreateBar()
{
return new Bar(x, () => y);
}
}
[Serializable]
public class Bar
{
private int a;
private Func<int> b;
public Bar(int a, Func<int> b)
{
this.a = a;
this.b = b;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,对象和值的范围会发生什么?由于x是值类型,因此它将按值传递给Bar,因此,不需要对其范围进行任何操作.但是y会发生什么?当实际评估b时,y的值需要保持不变.是不是所有的Foo都会在以后评估y?我只能假设Foo不是GC.
现在让我们说我们将Bar序列化为磁盘,然后再对其进行反序列化.什么实际上被序列化?它是否也将Foo序列化?是什么魔法发生了以便在反序列化后可以评估b?你能解释IL中发生的事情吗?
c# ×5
.net ×3
generics ×2
database ×1
delegates ×1
file ×1
file-io ×1
ilmerge ×1
nhibernate ×1
objective-c ×1
scope ×1
soap ×1
sql ×1
transactions ×1
types ×1
wcf ×1
ws-security ×1