小编Bob*_*orn的帖子

收集属性应该只读 - 漏洞?

在遵守代码分析错误的过程中,我正在将我的属性更改为拥有私有的setter.然后我开始尝试理解为什么多一点.从一些研究,MS说这个:

可写集合属性允许用户使用完全不同的集合替换集合.

答案在这里指出:

List<T>对象上添加公共setter 是危险的.

但它没有列出危险的原因.这就是我很好奇的部分.

如果我们有这个集合:

public List<Foo> Foos { get; set; }
Run Code Online (Sandbox Code Playgroud)

为什么要将setter设为私有?显然我们不希望客户端代码替换集合,但如果客户端可以删除每个元素,然后添加他们想要的东西,那有什么意义呢?这与完全替换集合不一样吗?遵循此代码分析规则如何提供价值?

c# oop code-analysis

4
推荐指数
1
解决办法
3139
查看次数

业务层(BLL)数据访问层(DAL)和UI之间的通用结构?

我希望我的所有图层BLL,DAL和UI共享类(具体或接口).

这真的是一种不好的做法吗?

我不想从我的DAL方法返回数据表,而是返回BLL可以直接使用的对象.

我希望有一个单独的VS项目,其中包含所有层应该知道的类.

示例:我想定义一个所有层都应该知道的批次类.UI应该能够接收批次类,以便显示或使用户能够提交要处理的批次.此外,DAL应该能够使用批次类查询数据库并返回它们.另一方面,BLL应该获得这些批次并将业务规则应用到它们上.

如果这是完全错误的替代品有哪些?

.net c# user-interface data-access-layer business-layer

4
推荐指数
1
解决办法
3165
查看次数

使用"额外"变量是不对的,因为它更容易调试?

我只是调试一些看起来像这样的代码:

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; 当代码全部在一行时,我无法做的事情.

既然我已经完成了调试,我应该把代码放回原来的样子,还是把它留下两行?

c#

4
推荐指数
1
解决办法
189
查看次数

无法创建新的MatchCollection - 没有定义构造函数

所以,也许我累了,但为什么我不能创造一个新的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为我的方法创建一个新的实例返回?

c#

4
推荐指数
1
解决办法
1441
查看次数

Process.Start()在后台线程上运行时挂起

我整天都在排除故障.经过一些研究和大量的反复试验后,似乎我已经能够将问题缩小到我的调用对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)

c# multithreading timer

4
推荐指数
1
解决办法
7899
查看次数

棘手的IDisposable问题

我正在尝试抽象/封装以下代码,因此所有客户端调用都不需要重复此代码.例如,这是一个从视图模型(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嵌入自身.这就是视图模型在处理后尝试使用它的原因/方式.WcfClientProxyCreateChannel()

如何正确处理WcfChannelFactory?我如何抽象此代码,以使我的视图模型调用尽可能简单?我希望我解释得这么好.

编辑 - 解决了!

根据牛排回答,这样做了:

public static …
Run Code Online (Sandbox Code Playgroud)

c# dispose

4
推荐指数
1
解决办法
252
查看次数

中央标准时间减去一小时

我有一个问题,我的时间已经过了一个小时.我正在尝试创建一个具有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.

c# datetime

4
推荐指数
1
解决办法
136
查看次数

Unity - 依赖项的解析失败(未注册)

我在这行代码上遇到错误:

    using (IMaterialClient rawMaterialServiceProxy =
ServerUtility.Container.Resolve<IMaterialClient>())
Run Code Online (Sandbox Code Playgroud)

错误:

依赖关系的解析失败...当前类型Xxx是一个接口,无法构造.你错过了类型映射吗?

我没有注册具体的IMaterialClient.在我刚看过的Pluralsight视频中,他们说你不必注册所有类型,因为如果没有指定,Unity会找到一个实现.这改变了吗?我错过了什么吗?为什么不解决这个问题?运行此程序时,具有实际IMaterialClient实现的程序集位于bin文件夹中.

c# unity-container

3
推荐指数
2
解决办法
1万
查看次数

WCF和[DataMember]属性

我有以下(缩写)类通过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调用时,只有第一个属性会被序列化并发送给客户端?

c# wcf

3
推荐指数
1
解决办法
4360
查看次数

XML SelectNode() 不返回任何内容。为什么命名空间很重要?

我有代码来获取根元素的节点:

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)

我有两个问题:

  1. 为什么命名空间很重要?如果我想要一个节点,并且它存在,就给我吧。
  2. 我的应用程序处理许多 XML 文件。我应该如何指定名称空间 ( 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)

c# xml

3
推荐指数
1
解决办法
293
查看次数