我已经使用Unity很长一段时间,但我一直使用它与构造函数注入.为了减少我必须注入到我的视图模型中的类的数量(因为我的命令依赖于它们),我想我会尝试创建一个使用Property Injection的概念,从而消除对大型构造函数参数列表的要求.这是场景......
我正在创建一个视图模型,其中的命令位于以某种方式使用/更新软件视图模型的属性上.我希望将View Model的实例传递给View Models属性上的Commands的构造函数.例如
public MainViewModel
{
public MainViewModel()
{
Customers = new ObservableCollection<CustomerViewModel>();
}
[Depedency("LoadCommand")]
public ICommand LoadCustomersCommand { get; set; }
public ObservableCollection<CustomerViewModel> Customers { get; private set; }
}
public LoadCustomersCommand : ICommand
{
public LoadCustomersCommand(MainViewModel mainViewModel)
{
//Store view model for later use
}
//... implementation
}
//Setup code in App.Xaml
IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<ICommand, LoadCommand>("LoadCommand");
unityContainer.RegisterType<MainViewModel>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
当我解析MainViewModel类时,我得到一个StackOverflow异常(如果Visual Studio完全回来的话).现在我希望Unity首先创建一个MainViewModel实例,因为它基本上是一个单例,然后查看View Model的实例并创建在新创建的MainViewModel中传递的Command,但显然我错了.
有任何想法吗?
如果一个地址可以由子元素组成:Street,City,State,PostalCode ......你如何允许这个XML:
<Address>
<Street>Somestreet</Street>
<PostalCode>zip</PostalCode>
</Address>
Run Code Online (Sandbox Code Playgroud)
并允许这个:
<Address>
<City>San Jose</City>
<Street>Somestreet</Street>
<State>CA</State>
</Address>
Run Code Online (Sandbox Code Playgroud)
但不是这个:
<Address>
<Street>Somestreet</Street>
<City>San Jose</City>
</Address>
Run Code Online (Sandbox Code Playgroud)
什么架构会做这样的事情!?
Scala 2.8的一个新功能是上下文边界.什么是上下文绑定以及它在哪里有用?
当然我先搜索(例如找到这个),但我找不到任何非常清晰和详细的信息.
double testx, testy, testdeg, testrad, endx, endy;
testx = 1;
testy = 1;
testdeg = atan2( testx, testy) / Math::PI* 180;
testrad = sqrt(pow(testx,2) + pow(testy,2));
endx = testrad * cos(testdeg);
endy = testrad * sin(testdeg);
Run Code Online (Sandbox Code Playgroud)
这个部分似乎等同于正确,除了endx和endy应该= testx和testy他们在手工计算时做.
在Python 2.x中,我写了......
for i in range(5):
print i,
Run Code Online (Sandbox Code Playgroud)
...从同一行打印0到4的整数.如何在Python 3.x中执行此操作,因为print现在是一个函数?
我在这里找到了这篇文章:
量化垃圾收集与显式内存管理的性能
http://www.cs.umass.edu/~emery/pubs/gcvsmalloc.pdf
在结论部分,它写道:
通过比较一系列基准测试的运行时,空间消耗和虚拟内存占用,我们表明,当给定足够的内存时,性能最佳的垃圾收集器的运行时性能与显式内存管理相比具有竞争力. 特别是,当垃圾收集的内存是所需内存的五倍时,其运行时性能与显式内存管理的性能相匹配或稍微超过.但是,当必须使用较小的堆时,垃圾收集的性能会大幅降低.内存的三倍,平均运行速度慢17%,内存增加一倍,运行速度减慢70%.当物理内存不足时,垃圾收集也更容易被分页.在这种情况下,我们在这里检查的所有垃圾收集器都会受到相对于显式内存管理的数量级性能损失.
所以,如果我的理解是正确的:如果我有一个用本机C++编写的应用程序需要100 MB内存,要实现与"托管"(即基于垃圾收集器)语言(例如Java,C#)相同的性能,应用程序应该要求5*100 MB = 500 MB?(并且2*100 MB = 200 MB,托管应用程序比本机应用程序运行速度慢70%?)
您是否知道当前(即最新的Java VM和.NET 4.0)垃圾收集器是否遇到上述文章中描述的相同问题?现代垃圾收集器的性能有所改善吗?
谢谢.
哪种转换命名约定是大多数语言的标准?
convert_from_typea_to_typeb(arg)
Run Code Online (Sandbox Code Playgroud)
或者
convert_to_typeb_from_typea(arg)
Run Code Online (Sandbox Code Playgroud)
或者还有其他标准吗?
我有一个复杂的WPF控件,由于某些原因(即性能)没有使用依赖属性而是简单的C#属性(至少在顶级,它们作为属性公开).
目标是使绑定到一些顶级属性成为可能 - >我想我应该将它们声明为DP.(对吗?还是有其他方法来实现这一点?)
我开始在MSDN上阅读DependencyProperties和DependencyObjects并找到一个例子:
public class MyStateControl : ButtonBase
{
public MyStateControl() : base() { }
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
Run Code Online (Sandbox Code Playgroud)
如果我是对的 - 这段代码强制要由DependencyProperty备份属性,它将它限制为一个带存储的简单属性(从功能的角度来看,不是技术上的),而不是每次getter都能计算属性值调用并在每次调用setter时设置其他属性/字段.
我该怎么办?有什么方法可以让这两个世界在某个时刻相遇吗?
//编辑我想我必须告诉你更多关于我想做什么以及我的局限性.所以:
我有TabControl绑定到ViewModel(我正在使用MVVM模式)对象的集合.每个选项卡都是该集合的一个对象的编辑器.对象可以是不同的类型,因此我有多个定义,每个定义具有不同的DataType属性.现在,我有一个复杂的WPF控件,我想将其用作其中一个DataTemplates的一部分.如果我使用通常的TextBox,我可以简单地绑定到它的Text属性,但我不能对该自定义控件的Text属性执行相同的操作,因为它的Text属性不是依赖属性.在这种情况下,我有:
但我能看到一个肮脏的解决方案 -
这是错误的,因为:
根据我的理解,SerializableAttribute不提供编译时检查,因为它都是在运行时完成的.如果是这种情况,那么为什么要将类标记为可序列化?
串行器无法尝试序列化对象然后失败?这不就是它现在做的吗?当标记某些内容时,它会尝试并失败.如果你必须将事物标记为不可序列化而不是可序列化,那不是更好吗?那样你就不会有库不将事物标记为可序列化的问题?
我找到了以下C++代码(评论自己添加):
// frame_name is a char array
// prefix is std::string
// k is a for loop counter
// frames is a std::vector string
sprintf(frameName, "%s_%0*s.bmp", prefix.c_str(), k, frames[k].c_str());
Run Code Online (Sandbox Code Playgroud)
然后我尝试将其翻译为C#
// prefix is string
// k is a for loop counter
// frames is List<string>
string frameName = string.Format("{0}_(what goes in here?).bmp", prefix, k, frames[k]);
Run Code Online (Sandbox Code Playgroud)
基本上,C++格式字符串"%s_%0*s.bmp"的C#等价物是什么?
编辑,@ Mark Byers:
我已经尝试了你的代码并做了一个小测试程序:
static void Main(string[] args)
{
List<string> frames = new List<string>();
frames.Add("blah");
frames.Add("cool");
frames.Add("fsdt");
string prefix = "prefix";
int n = …
Run Code Online (Sandbox Code Playgroud)