小编Car*_*ine的帖子

Debug.Assert与Code Contract的使用

我什么时候应该调试代码合同上的问题,反之亦然?我想检查一个方法的前提条件,我很困惑,选择一个而不是另一个.我有单元测试,我想测试故障情况并期望异常.

在同一方法上使用Debug.Assert和Code契约是一个好习惯.如果是这样,代码的编写顺序是什么?

Debug.Assert(parameter!= null);
Contract.Requires<ArgumentNullException>(parameter != null, "parameter");
Run Code Online (Sandbox Code Playgroud)

要么

Contract.Requires<ArgumentNullException>(parameter != null, "parameter");
Debug.Assert(parameter!= null);
Run Code Online (Sandbox Code Playgroud)

它背后有什么理由吗?

c# assert code-contracts

42
推荐指数
2
解决办法
8823
查看次数

c#应用程序中托管堆和本机堆之间有什么区别

从这里http://blogs.msdn.com/b/visualstudioalm/archive/2014/04/02/diagnosing-memory-issues-with-the-new-memory-usage-tool-in-visual-studio.aspx

  1. 托管:对于托管应用程序,概要分析程序仅默认收集托管堆信息.通过在分析器中捕获一组CLR ETW事件来完成托管堆分析.
  2. Native:对于本机应用程序,探查器仅收集本机堆信息.为了收集本机堆信息,我们启用堆栈跟踪和堆跟踪(ETW)的集合,它们非常详细并将创建大型diagsession文件.

我的问题是在我的c#程序中(我只有c#代码和xaml文件)什么类型的对象将进入托管堆,什么类型的本机堆?如何在应用程序运行时指定每个堆的最大大小?我假设GC只在托管堆上运行,这是正确的吗?

c#

15
推荐指数
1
解决办法
5442
查看次数

"类型或命名空间名称'[Type]'在此范围内无效"Visual Studio Watch Window中的错误?

我在Watch Window尝试观察任何类型时遇到麻烦,我不断收到错误"类型或命名空间名称'[Type]'在此范围内无效".我必须在监视窗口中提供完整的命名空间以及类型来修复此错误.

这只是任何类型的例子 -

如果我添加一个像new Uri(Location) 手表窗口的手表显示错误.所以我应该包含new System.Uri(Location)它的命名空间.这更令人烦恼.

找到此链接,找到它的项目的代码合同设置导致此问题.禁用运行时合同检查代码合同后,Watch/Quick Watch按预期工作.

项目属性 - >代码合同 - >禁用执行运行时合同检查

启用运行时合同检查代码合同有什么问题?代码合同设置有问题吗?或与项目设置有关?或Visual Studio中的错误?

c# ide code-contracts visual-studio-2012

8
推荐指数
1
解决办法
1511
查看次数

RFID RC522 Raspberry PI 2 Windows IOT

我正在寻找一种在Windows IOT上的Raspberry Pi 2.0上使用RFID"RC522"的方法.

它当然不是官方兼容......

官方的一个(OM5577演示板)在法国是昂贵的(我没有找到任何经销商出售它没有很多运费(总成本约80美元)).

RC522便宜(<10 $).它适用于Arduino和Linux上的Raspberry Pi 2.0.但不幸的是还没有Windows IOT.

我实际上是使用arduino作为桥梁......它不是最佳解决方案; 但工作良好,成本总是比OM5577低一半.

我找到了这个项目,并尝试将它们转换为带有Windows IOT SIP和IO的VS(Visual C++)项目......我悲惨地失败了......

在我的梦想中,我可以在C#中使用标准的Windows IOT"ProximityDevice"类.

你有什么想法吗?

提前致谢.

c# iot raspberry-pi2 windows-10-iot-core windowsiot

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

将ValueConverter存储到变量

我有一个ValueConverter用于绑定StoryBoard动画中的'To'Value,类似于答案 - WPF动画:绑定到storyboard动画的"To"属性.

问题是我MultiBinding ValueConverter在几个地方重复下面的代码.

    <MultiBinding Converter="{StaticResource multiplyConverter}">
       <Binding Path="ActualHeight" ElementName="ExpanderContent"/>
       <Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>
Run Code Online (Sandbox Code Playgroud)

我想通过将结果存储ValueConverter到资源变量来删除此重复代码,以便我可以将此本地变量直接绑定到故事板.

<system:Double x:Key="CalculatedWidth">
    <MultiBinding Converter="{StaticResource multiplyConverter}">
        <Binding Path="ActualHeight" ElementName="ExpanderContent"/>
        <Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>
</system:Double >
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

"Double"类型不支持直接内容.

无法将内容添加到"Double"类型的对象.

我觉得这是一个常见问题,但无法找到解决方案来消除这种冗余.

更新

谢谢Rohit,你的答案解决了这个问题.但我还有一个相关的问题,所以更新问题.这个变量CalculatedWidth在正常情况下工作正常,但是当它在RenderTransform中使用时,它不会获取值.即如果我使用正常的方式使用转换器它可以工作,但它不会获取变量.

<StackPanel.RenderTransform>
    <TranslateTransform x:Name="SliderTransform">
        <TranslateTransform.X>
            <Binding Converter="{StaticResource PanelConverter}" ElementName="SliderPanel" Path="ActualWidth" /> // Works
            <Binding Path="Width" Source="{StaticResource CalculatedWidth}"/> // Doesn't Work
        </TranslateTransform.X>
    </TranslateTransform>
</StackPanel.RenderTransform>
Run Code Online (Sandbox Code Playgroud)

我将变量保留为本地资源的一部分.这是否意味着在调用Render变换时不会创建变量?

c# wpf xaml ivalueconverter

6
推荐指数
1
解决办法
328
查看次数

如何得到 - 0为圆形小负数?

当我舍入一个小的负数时,它四舍五入为0.例如:decimal.Round(-0.001M, 2)返回0.

如果将其四舍五入为零,我该如何获得该符号.还有其他更好的方法,而不是检查n<0然后完成回合?

c# rounding

5
推荐指数
1
解决办法
426
查看次数

WPF将MouseDown和TouchDown结合到同一事件中

我正在开发一个应用程序,将用于带触摸屏的笔记本电脑上.因此,MouseDown事件基本上是在做同样的动作,应该怎么做.

我写的代码是这样的 -

XAML

<Button MouseDown="Button_OnMouseDown" TouchDown="Button_OnTouchDown"/>
Run Code Online (Sandbox Code Playgroud)

C#

private void Button_OnMouseDown(object sender, MouseButtonEventArgs e)
{
    Action();
}
private void Button_OnTouchDown(object sender, TouchEventArgs e)
{
    Action();
}
private void Action()
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?任何反馈都表示赞赏.

c# wpf mouseevent touch

5
推荐指数
1
解决办法
7833
查看次数

我应该在分配新对象之前处理旧对象吗?

假设我们有两个类FooBar,如下所示。

public class Foo
{
    public static Bar BarInstance { get; set; }

    public static void Main()
    {
        AssignBar("A");
        AssignBar("B");
    }

    private static void AssignBar(string name)
    {
        BarInstance = new Bar(name);
    }
}

public class Bar : IDisposable
{
    public Bar(string name)
    {
        Name = name;
    }
    public string Name { get; set; }
    protected virtual void Dispose(bool disposing)
    {
        if (!disposing)
        {
            return;
        }
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

当对象 A …

c# idisposable

5
推荐指数
1
解决办法
2393
查看次数

WPF TwoWay绑定到静态类属性

如果Mode = OneWay没有问题,但我有:Class:

namespace Halt
{
    public class ProjectData
    {
            public static string Username {get;set;}
    }
}
Run Code Online (Sandbox Code Playgroud)

和XAML:

xmlns:engine="clr-namespace:Halt.Engine"
<TextBox Name="UsernameTextBox" HorizontalAlignment="Stretch" Margin="10,5,10,0" Height="25"
         Text="{Binding Source={x:Static engine:ProjectData.Username}, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)

由于TwoWay模式,这不想工作.那么如何解决呢?

.net c# data-binding wpf binding

5
推荐指数
2
解决办法
3604
查看次数

DispatcherTimer在控制台中不起作用

我很好奇为什么调度程序计时器在控制台模式下不起作用。我创建了一个简单的警报,它在计时器达到极限时会执行某些操作。

您可以将调度程序计时器与UnitTest一起使用还是在控制台模式下使用?当我以某种形式运行它时,DailyAlarm起作用。

这是我调用计时器的代码

[TestClass]
public class UnitTest1
{
    bool runTest = true;
    [TestMethod]
    public void TestDailyAlarm()
    {
        DateTime alarmTime = new DateTime();
        alarmTime= DateTime.Now;
        alarmTime = alarmTime.AddSeconds(5);

        // MessageBox.Show(alarmTime.ToString());

        DailyAlarm alarm = new DailyAlarm(alarmTime);
        alarm.DailyAlarmEvent += alarm_DailyAlarmEvent;
        alarm.Start();
        while (runTest)
        {
            System.Threading.Thread.Sleep(1000);
        }
    }

    void alarm_DailyAlarmEvent(EventArgs e)
    {            
        MessageBox.Show("Alarm On");
        runTest = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的计时器代码

public class DailyAlarm
{
    #region Timer
    DispatcherTimer timer;
    #endregion

    #region AlarmTime
    DateTime _alarmTime;
    #endregion

    #region Event
    public delegate void DailyAlarmHandler(EventArgs e);
    public event DailyAlarmHandler …
Run Code Online (Sandbox Code Playgroud)

c# timer dispatchertimer

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

WPF通知PropertyChanged获取属性

我已经INotifyPropertyChanged实现了CallerMemberName

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
 if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,可以在任何属性的设置器中将OnPropertyChanged()其称为- ,它会在设置属性时通知属性更改事件。仅属性获取器不是这种情况。例如,

private DateTime _dob;
public DateTime DateOfBirth
{
    get
    {
        return _dob;
    }
    private set
    {
        _dob = value;
        OnPropertyChanged();
        OnPropertyChanged("Age");
    }
}

public int Age
{
    get
    {
        return DateTime.Today.Year - _dob.Year;
    }
}
Run Code Online (Sandbox Code Playgroud)

OnPropertyChanged()对于DateOfBirth可以正常使用,但是要通知Age更改,我应该记得OnPropertyChanged("Age")在的setter中进行调用DateOfBirth。我觉得这使得代码很难随时间进行维护。如果新属性取决于年龄,则还需要在DateOfBirth的设置器中进行通知。有没有更好的方法可以执行此操作而无需调用OnPropertyChanged(“ Age”)?

c# wpf inotifypropertychanged callermembername

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

如何单元测试FileStream的File.Open

首先,我熟悉单元测试模拟的概念,我正在根据TDD编写应用程序.

我有一个方法,我需要读取一个文件.读入文件:

 using (var webshopXmlFileStream = StreamFactory.Create(importFile))
 {
     // Opens a reader that will read the Xml file.
     using (var reader = XmlReader.Create(webshopXmlFileStream))
     {
         // Read the nodes "Node" and "ArticleGroup" recursively.
         var nodes = XmlReaderUtils.EnumerateAxis(reader, new[] { "Node", "ArticleGroup" });
     }
 }
Run Code Online (Sandbox Code Playgroud)

当然,这不是单元可测试的.

所以,我创建了一个名为的接口IStreamFactory,它只有一个方法:

Stream Create(string filePath);
Run Code Online (Sandbox Code Playgroud)

此接口的实现如下所示:

public Stream Create(string filePath)
{ 
  return File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None); 
}
Run Code Online (Sandbox Code Playgroud)

所以,现在我可以模拟界面返回a MemoryStream,如下所示:

const string webshopXmlData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                                "<Node>" +
                                  "<Name></Name>" +
                                "</Node>";
var streamFactoryMock …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing

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

从Log4Net日志文件创建zip会导致System.IO.IOException

我使用一个简单的代码片段从log4net日志文件创建一个zip文件.请参阅下面的代码.

var logFiles = Directory.GetFiles(log4netfolderName, "*.log*");
 using (var zip = ZipFile.Open(destinationDirectory.DirectoryPath  + "Test.zip", 
 ZipArchiveMode.Create))
 {
     foreach (var file in logFiles)
     {
         zip.CreateEntryFromFile(file, 
         Path.GetFileName(file), CompressionLevel.Optimal);
     } 
 }
Run Code Online (Sandbox Code Playgroud)

问题是log4net当前正在使用日志文件,我得到一个" 进程无法访问文件",因为它正被另一个进程使用.(System.IO.IOException)

此外,我无法更改log4net配置以使用进程中给出的最小锁定无法访问文件"MyFile.log",因为它正被另一个进程使用或者不知道如何在ZipFile类上使用FileStream .我该如何解决这个问题?

c# zip log4net

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