在遵守代码分析错误的过程中,我正在将我的属性更改为拥有私有的setter.然后我开始尝试理解为什么多一点.从一些研究,MS说这个:
可写集合属性允许用户使用完全不同的集合替换集合.
答案在这里指出:
在
List<T>
对象上添加公共setter 是危险的.
但它没有列出危险的原因.这就是我很好奇的部分.
如果我们有这个集合:
public List<Foo> Foos { get; set; }
Run Code Online (Sandbox Code Playgroud)
为什么要将setter设为私有?显然我们不希望客户端代码替换集合,但如果客户端可以删除每个元素,然后添加他们想要的东西,那有什么意义呢?这与完全替换集合不一样吗?遵循此代码分析规则如何提供价值?
我希望我的所有图层BLL,DAL和UI共享类(具体或接口).
这真的是一种不好的做法吗?
我不想从我的DAL方法返回数据表,而是返回BLL可以直接使用的对象.
我希望有一个单独的VS项目,其中包含所有层应该知道的类.
示例:我想定义一个所有层都应该知道的批次类.UI应该能够接收批次类,以便显示或使用户能够提交要处理的批次.此外,DAL应该能够使用批次类查询数据库并返回它们.另一方面,BLL应该获得这些批次并将业务规则应用到它们上.
如果这是完全错误的替代品有哪些?
我只是调试一些看起来像这样的代码:
string someValue = _snuh.FindItem(id).Value;
Run Code Online (Sandbox Code Playgroud)
我想检查FindItem()
(它返回一个Foo
)的返回值,所以我把代码分成两行:
Foo foo = _snuh.FindItem(id);
string someValue = foo.Value;
Run Code Online (Sandbox Code Playgroud)
这让我可以在调试器中查看foo; 当代码全部在一行时,我无法做的事情.
既然我已经完成了调试,我应该把代码放回原来的样子,还是把它留下两行?
所以,也许我累了,但为什么我不能创造一个新的MatchCollection
?
我有一个MatchCollection
通过调用返回a的方法regex.Matches
:
public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
Regex regex = new Regex(@"\$\(.+?\)");
return regex.Matches(sourceString);
}
Run Code Online (Sandbox Code Playgroud)
如果参数为null,我想要做的是返回一个空集合:
public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
if (sourceString == null)
{
return new MatchCollection();
}
Regex regex = new Regex(@"\$\(.+?\)");
return regex.Matches(sourceString);
}
Run Code Online (Sandbox Code Playgroud)
但由于这一行,这将无法编译:
return new MatchCollection();
Run Code Online (Sandbox Code Playgroud)
错误:
类型'System.Text.RegularExpressions.MatchCollection'没有定义构造函数.
一个类型如何定义没有构造函数?我认为如果没有显式定义构造函数,将创建默认构造函数.是否无法MatchCollection
为我的方法创建一个新的实例返回?
我整天都在排除故障.经过一些研究和大量的反复试验后,似乎我已经能够将问题缩小到我的调用对process.Start()
定时器线程不起作用的事实.以下代码在主线程上运行时有效.将完全相同的代码放在计时器回调中,它就会挂起.为什么?如何让它与计时器一起使用?
private static void RunProcess()
{
var process = new Process();
process.StartInfo.FileName = "cmd";
process.StartInfo.Arguments = "/c exit";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start(); // code hangs here, when running on background thread
process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
Run Code Online (Sandbox Code Playgroud)
编辑
作为测试,我在另一台笔记本电脑上使用了完全相同的代码,我遇到了同样的问题.这是完整的代码,可以粘贴到控制台应用程序中.process.Start()
挂起,但一旦我点击任何键结束,process.Start()
在程序结束前完成.
private static System.Timers.Timer _timer;
private static readonly object _locker = new object();
static void Main(string[] args)
{
ProcessTest();
Console.WriteLine("Press any key to end.");
Console.ReadKey();
}
private static …
Run Code Online (Sandbox Code Playgroud) 我正在尝试抽象/封装以下代码,因此所有客户端调用都不需要重复此代码.例如,这是一个从视图模型(MVVM)到WCF服务的调用:
using (var channelFactory = new WcfChannelFactory<IPrestoService>(new NetTcpBinding()))
{
var endpointAddress = ConfigurationManager.AppSettings["prestoServiceAddress"];
IPrestoService prestoService = channelFactory.CreateChannel(new EndpointAddress(endpointAddress));
this.Applications = new ObservableCollection<Application>(prestoService.GetAllApplications().ToList());
}
Run Code Online (Sandbox Code Playgroud)
我最初的重构尝试是这样做:
public static class PrestoWcf
{
public static IPrestoService PrestoService
{
get
{
using (var channelFactory = new WcfChannelFactory<IPrestoService>(new NetTcpBinding()))
{
var endpointAddress = ConfigurationManager.AppSettings["prestoServiceAddress"];
return channelFactory.CreateChannel(new EndpointAddress(endpointAddress));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我的视图模型现在只用一行代码进行调用:
this.Applications = new ObservableCollection<Application>(PrestoWcf.PrestoService.GetAllApplications().ToList());
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个错误WcfChannelFactory
已经处理掉了.这是有道理的,因为当视图模型试图使用它时它确实被处理掉了.但是,如果我删除了using
,那么我没有妥善处理掉WcfChannelFactory
.注意,在调用when时WcfChannelFactory
嵌入自身.这就是视图模型在处理后尝试使用它的原因/方式.WcfClientProxy
CreateChannel()
如何正确处理WcfChannelFactory
?我如何抽象此代码,以使我的视图模型调用尽可能简单?我希望我解释得这么好.
编辑 - 解决了!
根据牛排回答,这样做了:
public static …
Run Code Online (Sandbox Code Playgroud) 我有一个问题,我的时间已经过了一个小时.我正在尝试创建一个具有CT时区的时间.这样做,我有这行代码:
var zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
Run Code Online (Sandbox Code Playgroud)
它显示了这个:
{(UTC-06:00)中部时间(美国和加拿大)}
为什么?现在是2018年7月12日,CT是UTC-05.那么为什么我的调试信息显示UTC-06?在VS调试器中,对象也有:
SupportsDaylightSavingTime = true
如果重要的话,我现在在ET,现在是UTC-04.
我在这行代码上遇到错误:
using (IMaterialClient rawMaterialServiceProxy =
ServerUtility.Container.Resolve<IMaterialClient>())
Run Code Online (Sandbox Code Playgroud)
错误:
依赖关系的解析失败...当前类型Xxx是一个接口,无法构造.你错过了类型映射吗?
我没有注册具体的IMaterialClient.在我刚看过的Pluralsight视频中,他们说你不必注册所有类型,因为如果没有指定,Unity会找到一个实现.这改变了吗?我错过了什么吗?为什么不解决这个问题?运行此程序时,具有实际IMaterialClient实现的程序集位于bin文件夹中.
我有以下(缩写)类通过WCF发送到客户端/从客户端接收:
public class Sparetime : ChartConfigurationBase, IChartConfiguration
{
[DataMember]
public int SparetimeConfigurationId { get; set; }
public Single FeederOffRate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,第一个属性使用DataMember属性,第二个属性不使用.我是否更正,在进行WCF调用时,只有第一个属性会被序列化并发送给客户端?
我有代码来获取根元素的节点:
xmlNodes = rootElement.SelectNodes("DefinitionName");
Run Code Online (Sandbox Code Playgroud)
它不返回存在的节点。在调试器中,我可以展开 rootElement 以查找 DefinitionName。显然,问题在于该文件定义了命名空间(请参阅下面的 XML)。MSDN说我必须做这样的事情才能让节点返回:
注意:这与我的代码无关。这是来自 MSDN 的示例:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com");
XmlNodeList nodelist = doc.SelectNodes("//ab:book", nsmgr);
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
nsmgr.AddNamespace()
)?我需要先解析文件才能得到它吗?我不禁觉得我正在采取漫长而充满焦虑的方式来做这件事。
这是 XML:
<?xml version="1.0" encoding="utf-8"?>
<SessionStateInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
z:Id="1" z:Type="Company.Apps.MoreHere.Session.SessionStateInfo"
z:Assembly="assembly info here"
xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns="http://schemas.datacontract.org/2004/07/MoreHere.Session">
<CoaterNumber>25</CoaterNumber>
<DefinitionName z:Id="2">Two Line</DefinitionName>
<EnableManualMode>true</EnableManualMode>
Run Code Online (Sandbox Code Playgroud)