我从C++切换到Java和C#,并认为命名空间/包的使用在那里(结构良好)更好.然后我回到C++并试图以相同的方式使用命名空间,但在头文件中所需的语法是可怕的.
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
Run Code Online (Sandbox Code Playgroud)
以下内容对我来说也很奇怪(避免深度缩进):
namespace MyCompany
{
namespace MyModule
{
namespace MyModulePart //e.g. Input
{
namespace MySubModulePart
{
namespace ...
{
public class MyClass
{
Run Code Online (Sandbox Code Playgroud)
是否有更短的方式来表达上述事情?我错过了类似的东西
namespace MyCompany::MyModule::MyModulePart::...
{
public class MyClass
Run Code Online (Sandbox Code Playgroud)
更新
好吧,有人说Java/C#和C++中的使用概念是不同的.真?我认为(动态)类加载不是命名空间的唯一目的(这是一个非常技术性的推理视角).为什么我不应该将它用于可读性和结构化,例如想到"IntelliSense".
目前,命名空间与您可以在其中找到的内容之间没有逻辑/粘合剂.Java和C#做得更好......为什么要包含<iostream>和拥有命名空间std?好吧,如果你说的逻辑应该依靠头部以包括,为什么#包括不使用的"智能感知"友好的语法像#include <std::io::stream>或<std/io/stream>?我认为与Java/C#相比,缺省库中缺少的结构化是C++的一个弱点.
如果狂热冲突的唯一性是一个Point(这也是C#和Java的一个点),一个好主意是使用项目名称或公司名称作为命名空间,你不这么认为吗?
一方面它说C++是最灵活的...但每个人都说"不要这样做"?在我看来,C++可以做很多事情,但是在很多情况下,与C#相比,即使是最简单的事情也会有一种可怕的语法.
更新2
大多数用户认为创建比两个级别更深的嵌套是无稽之谈.好的,那么Win8开发中的Windows :: UI :: Xaml和Windows :: UI :: Xaml :: Controls :: Primitives名称空间呢?我认为微软对名称空间的使用是有道理的,它确实比仅仅2级更深.我认为更大的库/项目需要更深层次的嵌套(我讨厌像ExtraLongClassNameBecauseEveryThingIsInTheSameNameSpace这样的类名...那么你也可以将所有东西放到全局命名空间中.)
更新3 - …
从以下情况开始:
public interface ISample
{
}
public class SampleA : ISample
{
// has some (unmanaged) resources that needs to be disposed
}
public class SampleB : ISample
{
// has no resources that needs to be disposed
}
Run Code Online (Sandbox Code Playgroud)
SampleA类应实现用于释放资源的接口IDisposable.您可以通过两种方式解决此问题:
1.将所需的接口添加到SampleA类:
public class SampleA : ISample, IDisposable
{
// has some (unmanaged) resources that needs to be disposed
}
Run Code Online (Sandbox Code Playgroud)
2.将其添加到接口ISample并强制派生类来实现它:
public interface ISample : IDisposable
{
}
Run Code Online (Sandbox Code Playgroud)
如果将其放入界面,则强制任何实现实现IDisposable,即使它们没有任何可处置的内容.另一方面,很清楚地看到接口的具体实现需要一个dispose/using块,而你不需要像IDisposable一样进行清理.在两种方式中可能会有更多的优点/缺点...为什么你建议使用一种优先于另一种方式?
当实现类已经从QObject/QWidget中获取时,如何在抽象类/接口中声明Qt信号?
class IEmitSomething
{
public:
// this should be the signal known to others
virtual void someThingHappened() = 0;
}
class ImplementEmitterOfSomething : public QWidget, public IEmitSomething
{
// signal implementation should be generated here
signals: void someThingHappended();
}
Run Code Online (Sandbox Code Playgroud) 我见过的大多数代码都使用以下方式来声明和调用事件触发:
public class MyExample
{
public event Action MyEvent; // could be an event EventHandler<EventArgs>, too
private void OnMyEvent()
{
var handler = this.MyEvent; // copy before access (to aviod race cond.)
if (handler != null)
{
handler();
}
}
public void DoSomeThingsAndFireEvent()
{
// ... doing some things here
OnMyEvent();
}
}
Run Code Online (Sandbox Code Playgroud)
甚至ReSharper也会按照上面提到的方式生成一个调用方法.
为什么不这样做:
public class MyExample
{
public event Action MyEvent = delegate {}; // init here, so it's never null
public void DoSomeThingsAndFireEvent()
{
// ... doing …Run Code Online (Sandbox Code Playgroud) 我想awaitable async在注册过程中调用一个方法,如下所示:
// builder variable contains Autofac ContainerBuilder
builder.Register(
(async (context, parameters) => // need async here
{
var someClass = new SomeClass(context.Resolve<ISomeDependency>());
await someClass.SomeAsyncInitMethod(); // need to await result
return someClass;
})).As<ISomeClass>().SingleInstance();
Run Code Online (Sandbox Code Playgroud)
SomeClass实现ISomeClass为服务.重要的部分是someClass.SomeAsyncInitMethod()电话.这是async因为,因此我需要在await这里将async关键字放入Register方法中.但现在Autofac认为这会返回一个Task<SomeClass>不可注册的Service ISomeClass.
如何实现上述注册SomeClass为ISomeClass等待时async的init方法?
在尝试构建使用CMake的项目时,通常会有许多swiches启用/禁用.
如何存储某些用户创建的构建设置,以使构建在另一台机器上可重现?是否有某种导出功能或者您只是复制构建(缓存)文件夹?
我在命令行使用msbuild来构建生成的解决方案文件:
msbuild /p:Configuration=Release /p:Platform=Win32 build\zlib\vc-9.0\x86\zlib.sln
Run Code Online (Sandbox Code Playgroud)
问题是cmake生成的解决方案有一个项目INSTALL,它不是默认构建的.
minigzip:
Die Datei "c:\Library\build\zlib\vc-9.0\x86\minigzip.tmp_Release_Win32.vcproj
" wird gelöscht.
ALL_BUILD:
Die Datei "c:\Library\build\zlib\vc-9.0\x86\ALL_BUILD.tmp_Release_Win32.vcpro
j" wird gelöscht.
INSTALL:
The project "INSTALL" is not selected for building in solution configuration
"Release|Win32".
Done Building Project "c:\Library\build\zlib\vc-9.0\x86\zlib.sln" (default targ
ets).
Build succeeded.
0 Warning(s)
0 Error(s)
Run Code Online (Sandbox Code Playgroud)
如何在不手动打开灵魂的情况下强制构建目标INSTALL并设置配置的复选框?
一种解决方案是直接调用vcproj文件(就像我在这里做的那样)
msbuild /p:Configuration=Release /p:Platform=Win32 build\zlib\vc-9.0\x86\INSTALL.vcproj
Run Code Online (Sandbox Code Playgroud)
但这会打印警告
Microsoft (R)-Buildmodul, Version 3.5.30729.6387
[Microsoft .NET Framework, Version 2.0.50727.6400]
Copyright (C) Microsoft Corporation 2007. Alle Rechte vorbehalten.
Build started 06.07.2013 17:07:57.
Project "c:\Library\build\zlib\vc-9.0\x86\INSTALL.vcproj" on node 0 (default …Run Code Online (Sandbox Code Playgroud) 打电话有效吗?
QObject::connect(a, SIGNAL(somesig(someparam)), b, SLOT(someslot()));
Run Code Online (Sandbox Code Playgroud)
没有参数?它似乎工作(没有抛出运行时异常),但我在文档中找不到引用.我发现只有someslot有一个默认参数才有可能.在这种情况下它是有效的.但是我的方法someslot没有与默认值相同的参数设置(示例中没有参数).
那么似乎可以将信号连接到参数较少的插槽?
在WPF中使用ListView 的分组功能时,样式左侧有一个小的边距.
具有分组问题的ListView示例(边距):

没有分组的ListView示例(在分组列表中需要相同样式的项目):

题:
如何删除边距/填充?分组列表中的(选定)项应填充与未分组列表中相同的空间.
更新:
<ListView Margin="20,0,0,0" ItemsSource="{Binding ItemsView}" SelectedItem="{Binding SelectedItem}" IsSynchronizedWithCurrentItem="True" SelectionMode="Single" BorderThickness="0" Background="Transparent">
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate DataType="data:Item">
<DockPanel HorizontalAlignment="Stretch">
<TextBlock Text="{Binding Name}" FontWeight="Bold" Margin="0,5,5,5" />
<Separator />
</DockPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
<ListView.ItemTemplate>
<DataTemplate DataType="data:Item">
<TextBlock Margin="10,10,10,10" Text="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Run Code Online (Sandbox Code Playgroud) 有没有人知道Caliburn.Micro屏幕/导体生命周期概述的来源?例如,序列图/流程图描述了它们的调用顺序/依赖关系以及它们被调用时的条件?到目前为止,我主要使用OnViewLoaded,但我想知道哪些是第二次调用(再次显示)等.我还没有找到关于屏幕生命周期的好文档.
是的,我知道它是开源的,我可以阅读源代码或调试(我现在正在做的事情)...只是认为这个要求对于使用Caliburn.Micro来说有点基础并且必须有已完成的事情,我不需要自己创建概述.也许答案也可能对其他人有所帮助.;-)
例如,当从Conductor.Collection.OneActive中获取时,有以下(甚至更多)方法似乎在生命周期中起作用并且可以重载:
protected virtual void OnInitialize()
protected virtual void OnActivate()
protected virtual void OnActivationProcessed(IScreen item, bool success)
protected virtual void OnDeactivate(bool close)
protected virtual void OnViewAttached(object view, object context)
protected virtual void OnViewLoaded(object view)
protected virtual void OnViewReady(object view)
Run Code Online (Sandbox Code Playgroud)
到目前为止我看到的这似乎是订单(应用程序启动退出):
但每种方法的要点是什么?例如,何时设置了datacontext,样式模板应用于视图并准备显示?视图何时显示?(ViewReady和ViewLoaded之间的区别?)