小编Joh*_*mse的帖子

好坏练习?在getter中初始化对象

我似乎有一种奇怪的习惯......据我的同事说,至少.我们一直在一个小项目上工作.我编写类的方式是(简化示例):

[Serializable()]
public class Foo
{
    public Foo()
    { }

    private Bar _bar;

    public Bar Bar
    {
        get
        {
            if (_bar == null)
                _bar = new Bar();

            return _bar;
        }
        set { _bar = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,基本上,我只在调用getter并且字段仍然为null时初始化任何字段.我认为这可以通过不初始化任何地方没有使用的任何属性来减少过载.

ETA:我这样做的原因是我的类有几个属性返回另一个类的实例,而这个属性又具有更多类的属性,依此类推.调用顶级类的构造函数随后将调用所有这些类的所有构造函数,而不是总是需要它们.

除个人偏​​好外,是否有任何反对这种做法的反对意见?

更新:我已经考虑了很多关于这个问题的不同意见,我将坚持我接受的答案.但是,我现在对这个概念有了更好的理解,我能够决定何时使用它,何时不能.

缺点:

  • 线程安全问题
  • 当传递的值为null时,不遵守"setter"请求
  • 微优化
  • 异常处理应该在构造函数中进行
  • 需要在类'代码中检查null

优点:

  • 微优化
  • 属性永远不会返回null
  • 延迟或避免加载"重"物体

大多数缺点不适用于我当前的库,但是我必须测试"微优化"是否实际上是在优化任何东西.

最后更新:

好的,我改变了答案.我最初的问题是这是否是一个好习惯.我现在确信它不是.也许我仍会在我当前代码的某些部分使用它,但不是无条件的,绝对不是所有的时间.因此,在使用它之前,我会失去习惯并思考它.感谢大家!

c# getter coding-style

167
推荐指数
8
解决办法
2万
查看次数

如何在同一个集合位置替换列表中的值

如何替换同一位置的集合列表中的值?

0 = cat
1 = dog
2 = bird
Run Code Online (Sandbox Code Playgroud)

更换2snail

c#

39
推荐指数
2
解决办法
8万
查看次数

如何使用C#4.0从文件夹解压缩所有.Zip文件,而不使用任何OpenSource Dll?

我有一个包含.ZIP文件的文件夹.现在,我想使用C#将ZIP文件解压缩到特定文件夹,但不使用任何外部程序集或.Net Framework 4.5.

我搜索过,但没有找到任何使用Framework 4.0或更低版本解压缩*.zip文件的解决方案.

我尝试过GZipStream,但它只支持.gz而不支持.zip文件.

c# unzip zipfile

21
推荐指数
2
解决办法
7万
查看次数

在knockout.js中禁用锚标记

我需要在HTML中的knockout.js的foreach循环中禁用锚标记.

这是我的代码:

<a id="aQStreamSkype" data-bind="attr:{href: ''}, click: $parent.StoreUserClick,disable: ($data.SkypeId == 'null')">Skype </a>
Run Code Online (Sandbox Code Playgroud)

html javascript knockout.js

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

为从List <string>继承的集合实现GetEnumerator()

我正在努力实施FilePathCollection.它的项目是简单的文件名(没有路径 - 例如"image.jpg").一旦通过foreach循环使用集合,它应该返回通过连接创建的完整路径baseDirectory.我怎样才能做到这一点?

public class FilePathCollection : List<string>
{
    string baseDirectory;

    public FilePathCollection(string baseDirectory)
    {
        this.baseDirectory = baseDirectory;
    }

    new public System.Collections.IEnumerator GetEnumerator()
    {
        foreach (string value in this._items) //this does not work because _list is private
            yield return baseDirectory + value;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# generics collections inheritance

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

识别原始打印机

我列举了连接在PC上的打印机.我是用C#System.Printing命名空间完成的.它运作良好.但主要是它显示软件打印机,如Microsoft XPS Document writer,Microsoft Fax等.我想知道是否可以从枚举中删除这些ssoftware打印机.我所做的代码如下所示:

PrintQueue printQueue = null;

LocalPrintServer localPrintServer = new LocalPrintServer();

// Retrieving collection of local printer on user machine
PrintQueueCollection localPrinterCollection =
    localPrintServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local,
                                            EnumeratedPrintQueueTypes.Connections });

System.Collections.IEnumerator localPrinterEnumerator =
    localPrinterCollection.GetEnumerator();

while (localPrinterEnumerator.MoveNext())
{
    // Get PrintQueue from first available printer
    printQueue = (PrintQueue)localPrinterEnumerator.Current;

    if (!printQueue.IsOffline)
    {
        MessageBox.Show(printQueue.FullName.ToString());
        string s = "Printer found " + printQueue.FullName.ToString();
        listBox1.Items.Add(s);
    }
    else
    {
        // No printer exist, return null PrintTicket 
        // return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# printers

15
推荐指数
2
解决办法
1178
查看次数

如何将内存流下载到文件?

我正在使用下面的示例代码来编写和下载内存流到C#中的文件.

MemoryStream memoryStream = new MemoryStream();
TextWriter textWriter = new StreamWriter(memoryStream);
textWriter.WriteLine("Something");           
byte[] bytesInStream = new byte[memoryStream.Length];
memoryStream.Write(bytesInStream, 0, bytesInStream.Length);
memoryStream.Close();          
Response.Clear();
Response.ContentType = "application/force-download";
Response.AddHeader("content-disposition",
                   "attachment; filename=name_you_file.xls");
Response.BinaryWrite(bytesInStream);
Response.End();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

指定的参数超出了有效值的范围.
参数名称:offset

可能是什么原因?

c# asp.net memorystream

12
推荐指数
2
解决办法
6万
查看次数

Silverlight测试:Watin vs Selenium比较

我想知道这些Web测试框架(Watin和Selenium)对Silverlight UI测试的效果如何.

有人在项目上试过吗?Watin或Selenium非常适合Silverlight吗?

testing silverlight user-interface selenium watin

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

检查Excel是否处于脏状态

有什么方法我可以知道Excel是否处于脏状态.

脏状态我的意思是: - 当您在Excel上执行任何操作并关闭保存按钮时 - Excel会要求您保存文件.因此,在编辑文件时必须设置一些标志.

我可以通过C#代码了解Excel文件的状态吗?

搜索了很多,但没有多少帮助.有一个选项可以让您通过查看来了解Excel是否处于编辑状态GetRibbonControlEnabled("FileNewDefault")

在这种情况下,您只能在执行此方法时查看Excel是否处于编辑状态.

如果我想知道Excel是否在打开时被编辑/变脏了怎么办?

请不要建议开始使用上述功能继续查看Excel是否处于编辑模式的后台线程.

非常感谢帮助.

c# excel

11
推荐指数
1
解决办法
3099
查看次数

网络摄像头代码中的内存泄漏

好的,我一直在尝试通过网络摄像头做一些特定的视频.我有一个Lumenera Infinity 2显微镜,我试图从中提取饲料,并希望能够在进入时修改饲料.由于我找不到使用Video Source Player的方法,我决定改为拉动每个帧(相机的最大15fps)作为位图,以便我可以在那里进行修改.

问题是:我有一个巨大的内存泄漏.当我使用videoSourcePlayer运行视频时,它使用大约30兆的徘徊.当我将帧拉动为位图时,它会在几秒钟内打破1 gig的内存.

我错过了什么,这里?我认为自动垃圾收集会在旧框架无法访问时挖出旧框架.我应该尝试强制在位图上进行垃圾回收吗?或者它完全是另一回事,而且我还是错过了它.

FilterInfoCollection captureDevices;
VideoCaptureDevice cam;
Bitmap bitmap;

public Form1()
{
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
  try
  {
    captureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

    if (captureDevices.Count == 0)
      throw new ApplicationException();

    CameraSelectComboBox.Items.Clear();

    foreach (FilterInfo device in captureDevices)
    {
      CameraSelectComboBox.Items.Add(device.Name);
    }

    CameraSelectComboBox.SelectedIndex = 0;
    CameraSelectComboBox.Enabled = true;
  }
  catch (ApplicationException)
  {
    CameraSelectComboBox.Enabled = false;
  }
}

private void connectButton_Click(object sender, EventArgs e)
{
  cam = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
  cam.NewFrame -= Handle_New_Frame; //Just to avoid …
Run Code Online (Sandbox Code Playgroud)

c# webcam memory-leaks video-capture aforge

9
推荐指数
1
解决办法
2703
查看次数