我什么时候应该调试代码合同上的问题,反之亦然?我想检查一个方法的前提条件,我很困惑,选择一个而不是另一个.我有单元测试,我想测试故障情况并期望异常.
在同一方法上使用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#程序中(我只有c#代码和xaml文件)什么类型的对象将进入托管堆,什么类型的本机堆?如何在应用程序运行时指定每个堆的最大大小?我假设GC只在托管堆上运行,这是正确的吗?
我在Watch Window尝试观察任何类型时遇到麻烦,我不断收到错误"类型或命名空间名称'[Type]'在此范围内无效".我必须在监视窗口中提供完整的命名空间以及类型来修复此错误.
这只是任何类型的例子 -
如果我添加一个像new Uri(Location) 手表窗口的手表显示错误.所以我应该包含new System.Uri(Location)它的命名空间.这更令人烦恼.
找到此链接,找到它的项目的代码合同设置导致此问题.禁用运行时合同检查代码合同后,Watch/Quick Watch按预期工作.
项目属性 - >代码合同 - >禁用执行运行时合同检查
启用运行时合同检查代码合同有什么问题?代码合同设置有问题吗?或与项目设置有关?或Visual Studio中的错误?
我正在寻找一种在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"类.
你有什么想法吗?
提前致谢.
我有一个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变换时不会创建变量?
当我舍入一个小的负数时,它四舍五入为0.例如:decimal.Round(-0.001M, 2)返回0.
如果将其四舍五入为零,我该如何获得该符号.还有其他更好的方法,而不是检查n<0然后完成回合?
我正在开发一个应用程序,将用于带触摸屏的笔记本电脑上.因此,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)
有一个更好的方法吗?任何反馈都表示赞赏.
假设我们有两个类Foo和Bar,如下所示。
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 …
如果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模式,这不想工作.那么如何解决呢?
我很好奇为什么调度程序计时器在控制台模式下不起作用。我创建了一个简单的警报,它在计时器达到极限时会执行某些操作。
您可以将调度程序计时器与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) 我已经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”)?
首先,我熟悉单元测试模拟的概念,我正在根据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) 我使用一个简单的代码片段从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# ×13
wpf ×4
.net ×1
assert ×1
binding ×1
data-binding ×1
ide ×1
idisposable ×1
iot ×1
log4net ×1
mouseevent ×1
rounding ×1
timer ×1
touch ×1
unit-testing ×1
windowsiot ×1
xaml ×1
zip ×1