我在C#中使用jabber.net并且有一个让我困惑的怪癖,所以希望有人可以解释它是如何做到的.从C++背景来看,我对C#还是很陌生,所以这可能是一个误解
我正在创建一个只读JID来保存我需要输入的房间:
private readonly JID messagingRoomJID;
public MyClass
{
// Reads from database but for purpose of this question
messagingRoomJID = new JID("user@myserver");
}
Run Code Online (Sandbox Code Playgroud)
后来我想加入一个房间,这是我得到的东西,我很困惑
conferenceManager = new ConferenceManager();
conferenceManager.Stream = xmppClient;
// Before entering this room messagingRoomJID.Resource == null
theRoom = conferenceManager.GetRoom(messagingRoomJID);
// But now messagingRoomJID.Resource contains my username
Run Code Online (Sandbox Code Playgroud)
但资源如何改变?变量是只读的,但也不应该通过const引用传递,所以它是如何被更新的呢?
看起来我可以做到这一点,但我不确定这是明智的:
theRoom = conferenceManager.GetRoom(new JID(messagingRoomJID));
Run Code Online (Sandbox Code Playgroud) 我在看NotifyPropertyChanged()距离INotifyPropertyChanged,并注意到,在微软的例子,如在这里:
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
首先没有捕获委托引用(例如,它在这里说:在事件处理程序中使用null check)
我查看了自动生成的Reference.cs以获取我的ServiceReferences,并完成了此检查.
所以我的问题是我应该这样做(以任何形式,如扩展方法等)?如果不这样做,是否有任何可能的问题?
我正在阅读一些C#编码标准,它有:
"事件处理程序不应包含执行所需操作的代码.而是从事件处理程序调用另一个方法"
我想知道是否有理由(表演或其他)或者它只是一种风格偏好?
我知道用f后缀一个浮点数让编译器知道它是一个浮点而不是一个double.在浮子上操作而不是双打时,防止不必要的铸造非常重要.但是在某些代码中我是由外部公司提供的,例如我见过以下内容:
double i = 1.4f;
Run Code Online (Sandbox Code Playgroud)
现在我想知道的是这种情况会发生什么?编译器是否会默默地忽略'f',它只是对任何东西都没有影响的东西,我可以放心地忽略它?
然后我想知道如果将数字分配给其他地方带有f后缀的双精度数,那么不仅仅是在初始化时,这是一个不同的情况吗?
我有许多信号可以是真的,假的或无效的,但只有其中一个可以是真的,否则它是一个错误.
我想知道是否有办法轻松检查这个,而不是需要做一个大的if语句
enum sig_type
{
sig_invalid, sig_true, sig_false
};
sig_type sig1 = GetSignal("sig1");
sig_type sig2 = GetSignal("sig1");
sig_type sig3 = GetSignal("sig1");
sig_type sig4 = GetSignal("sig1");
if (sig1 == sig_true)
{
if (sig2 == sig_true || sig3 == sig_true || sig4 == sig_true)
{
// Error
}
}
else if (sig2 == sig_true)
{
if (sig1 == sig_true || sig3 == sig_true || sig4 == sig_true)
{
// Error
}
}
Run Code Online (Sandbox Code Playgroud)
等等......这是一个重要的代码量,只是随着我添加信号而增加,因此在这种状态下将无法管理
我想知道创建新对象作为方法的一部分(或实际构造函数调用)是否安全
比如下面的混乱例子:
public class Igloo
{
public int i = 5;
}
public class Program
{
static void Main(string[] args)
{
DoSomething(new Igloo());
}
private static void DoSomething(Igloo i)
{
Debug.WriteLine(i.i);
}
}
Run Code Online (Sandbox Code Playgroud)
创建像这样的临时对象不赞成?是否正确清理了创建的新对象.
我正在使用MVVMLight并经历一些学习曲线,试图找出通信的工作原理.我理解Properties如何与Silverlight绑定一起工作,这一切都很简单.
现在我想知道的是发送Message as a Command的最佳方法是什么.因此,例如,我想向我的ViewModel发送一条消息以清除其列表.
所以我可以创建一个枚举来充当命令
enum MessageOp
{
Reset
}
Run Code Online (Sandbox Code Playgroud)
但是,我怎么能把它作为命令发送?目前我发送它作为类,但然后需要再次作为令牌发送它.像这样:
Messenger.Default.Send<MessageOp>(MessageOp.Reset, MessageOp.Reset);
Run Code Online (Sandbox Code Playgroud)
我在ViewModel中的代码是这样的:
Messenger.Default.Register<MessageOp>(
this, MessageOp.Reset,
delegate(MessageOp op)
{
// Erase all entries
MyDictionary.Clear();
});
Run Code Online (Sandbox Code Playgroud)
我想到的一种方法是创建一个完全空的类来充当命令.这是最好的方法,因为我觉得有点奇怪创建空类来表现这样
存在一个存储在数据库中的角色列表,模型中只有一个角色.实体框架用于填充模型,但我认为这不重要.
代码打击似乎用于迭代这些:
foreach (var role in (new Role[1]).Concat(model.Roles))
{
}
Run Code Online (Sandbox Code Playgroud)
但说实话,我无法理解这段代码正在做什么.我所知道的是它循环两次而不是一次.任何人都可以澄清它在做什么吗?
我的WP7应用程序中有要求在多个数据源的bing映射上显示图钉,我不确定这样做的最佳方法.
例如,它会是这样的,我从Web服务接收人员列表,建筑物列表,POI列表等.我需要在他们自己的视图中单独显示这些,但也在地图上显示它们每种类型都有不同的图像.
我正在尝试使用MVVM方法,因此有一个Person类,一个建筑类等等,每个都有一个位置.然后我为每个类型都有一个ObservableCollection,因此使用数据绑定很容易为每个类型执行View.
目前我只有一个ViewModel,但我的第一个想法是我认为每个类型应该有一个ViewModel.那么PersonViewModel,BuildingViewModel在这里?但是,Map View需要从这些视图中获取信息,我不确定如何将视图绑定到多个ViewModel,或者即使这是合理的.
MapItemsControl似乎也只能绑定到一个东西,所以如何将它绑定到这样的多个不同的数据源?我想我可以创建一个简单的图钉类,但这意味着每个类型的数据都重复,我最终希望能够点击图钉来显示图钉的细节,所以我希望将这些类型分开
任何关于前进道路的指针都非常赞赏
我怀疑我正在努力使a QWizardPage做得比预期的要多,这就是为什么我遇到问题的原因,但是也许有一种方法可以做到。
因此,我在内有许多页面,QWizard并且在某个页面上,我针对某些硬件运行了一系列测试,然后将结果存储在数据库中。我希望能够在必要时取消。但是,目前“取消”按钮是QWizard的一部分,因此我不确定如何处理它。
我知道我可以覆盖其reject()功能,QWizard然后确定当前页面,如果它是我感兴趣的页面,则可以执行一些操作,但是除非有必要,否则我不希望以这种方式将页面捆绑在一起。
我确实尝试将rejected()信号连接到向导,如下所示:
connect(this, SIGNAL(rejected()), ui->runTestPage, SLOT(on_rejected()));
Run Code Online (Sandbox Code Playgroud)
但这无论如何都会立即关闭页面,然后我才能向用户显示任何内容以表示我要取消。
我可以在向导页面上添加一个按钮,该向导页面将在测试运行时显示以允许取消,但是该页面仍然具有主要的取消按钮。实际上,即使在测试完成后,“取消”仍然会显示,因此能够删除或禁用它似乎是适当的。
那么,这是我可以做的事情还是需要重新回顾向导的整个使用过程?