在C++朋友关键字允许class A
指定class B
作为其朋友.这允许Class B
访问private
/的protected
成员class A
.
我从来没有读过任何关于为什么这个被排除在C#(和VB.NET)之外的东西.早期StackOverflow问题的大多数答案似乎都说它是C++的一个有用部分,并且有充分的理由使用它.根据我的经验,我必须同意.
在我看来,另一个问题是如何friend
在C#应用程序中执行类似的操作.虽然答案通常围绕嵌套类,但它看起来并不像使用friend
关键字那么优雅.
最初的设计模式书在其示例中定期使用它.
总而言之,为什么friend
缺少C#,以及在C#中模拟它的"最佳实践"方式(或方法)是什么?
(顺便说一句,该internal
关键字不一样的东西,它可以让所有的整个组件来访问内部的阶级internal
的成员,同时friend
允许你给某一类的完全访问权限,以正好一个其他类)
我打算提出一个关于准备桌面应用程序以支持UI上的多种语言的问题.
在我搜索关于该主题的现有问题时,我正在考虑"国际"这个词,因此我选择了国际化标签并阅读了一些匹配的问题.
最终我意识到我应该在标记为Localization的问题下查找.然而,似乎我并不是唯一一个让这两个术语混淆的人.
那么,它们在本地化和国际化之间的主要区别是什么?
还有,他们之间是否真的那么重要?
给出以下简单示例:
List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };
CaseInsensitiveComparer ignoreCaseComparer = new CaseInsensitiveComparer();
var distinctList = list.Distinct(ignoreCaseComparer as IEqualityComparer<string>).ToList();
Run Code Online (Sandbox Code Playgroud)
似乎CaseInsensitiveComparer实际上并不用于进行不区分大小写的比较.
换句话说,distinctList 包含与列表相同数量的项目.相反,我希望,例如,"三"和"三"被认为是平等的.
我错过了什么,或者这是Distinct运营商的问题?
我们的应用程序中有一个错误,每次都不会发生,因此我们不知道它的"逻辑".我今天甚至没有将它复制100次.
免责声明:此错误存在,我已经看到了.它不是pebkac或类似的东西.
重现这种错误的常见提示是什么?
我正在寻找功能编程概念.
我已经使用Javascript多年来在Web应用程序中进行客户端脚本编写,除了使用原型之外,还有简单的DOM操作,输入验证等.
最近,我经常读到 Javascript是支持函数式编程的语言之一.
凭借我对Javascript的熟悉和经验,我倾向于使用它来学习函数式编程.我希望我能够更专注于主要的功能概念,而不是被一种全新的语法所困扰或分散注意力.
总而言之,Javascript是学习函数式编程概念的不错选择吗?Javascript中哪些功能相关/支持函数式编程?
Joe Duffy(Windows上的Concurrent Programming的作者)在这篇博客文章中写道,Thread.Sleep(1)比Thread.Sleep(0)更受欢迎,因为它将挂起相同和更低优先级的线程,而不仅仅是与Thread相同的优先级线程.睡眠(0).
在MSDN的.NET版本说是的Thread.Sleep(0)是特殊的,它会暂停这个线程,并允许其他等待线程执行.但它没有提及Thread.Sleep(1)(对于任何.NET版本).
那么,Thread.Sleep(1)实际上做了什么特别的事情吗?
背景:
我正在刷新我对并发编程的了解.我写了一些C#代码,可以明显地显示前/后增量和减量是非原子的,因此不是线程安全的.
为了避免需要创建数百个线程,我在递增共享变量之后放置一个Thread.Sleep(0)以强制调度程序运行另一个线程.这种线程的定期交换使得前/后递增/递减的非原子性质更加明显.
正如预期的那样,Thread.Sleep(0)似乎不会导致额外的延迟.但是,如果我将其更改为Thread.Sleep(1),它似乎恢复到正常的睡眠行为(例如,我大约至少延迟1ms).
这意味着虽然Thread.Sleep(1)可能是首选,但在循环中使用它的任何代码都会运行得慢得多.
这个问题"有人可以用Sleep(1)解释这个有趣的行为吗?" 有点相关,但它是以C++为重点,只是重复Joe Duffy的博客文章中的指导.
这是我感兴趣的任何人的代码(从LinqPad复制,所以你可能需要在它周围添加一个类):
int x = 0;
void Main()
{
List<Thread> threadList=new List<Thread>();
Stopwatch sw=new Stopwatch();
for(int i=0; i<20; i++)
{
threadList.Add(new Thread(Go));
threadList[i].Priority=ThreadPriority.Lowest;
}
sw.Start();
foreach (Thread thread in threadList)
{
thread.Start();
}
foreach (Thread thread in threadList)
{
thread.Join();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Thread.Sleep(200);
Console.WriteLine(x);
}
void Go()
{
for(int i=0;i<10000;i++)
{
x++;
Thread.Sleep(0);
}
}
Run Code Online (Sandbox Code Playgroud) 无论移动,重命名和内容修改,是否有办法在文件的生命周期内唯一标识文件(可能还有目录)?(Windows 2000及更高版本).制作文件的副本应该为副本提供它自己的唯一标识符.
我的应用程序将各种元数据与单个文件相关联.如果修改,重命名或移动文件,则能够自动检测和更新文件关联将非常有用.
FileSystemWatcher可以提供通知这些更改的事件,但是如果快速发生许多文件系统事件,它会使用可以轻松填充(和事件丢失)的内存缓冲区.
哈希是没有用的,因为文件的内容可以改变,因此哈希值会改变.
我曾想过使用文件创建日期,但是有一些情况下这不是唯一的(即复制多个文件时).
我还听说过NTFS中的文件SID(安全ID?),但我不确定这是否能满足我的要求.
有任何想法吗?
如何在样式定义中包含文本装饰,如下划线,删除线等:
<Style x:Key="UnderlinedLabel">
<Setter Property="Control.FontFamily" Value="Trebuchet MS" />
<Setter Property="Control.FontSize" Value="14" />
<!-- Next line fails -->
<Setter Property="Control.TextDecorations" Value="Underline" />
</Style>
Run Code Online (Sandbox Code Playgroud)
我熟悉使用以下XAML来强调文本:
<TextBlock>
<Underline>
Underlined text
</Underline>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
然而文本修饰只是另一种风格,我希望能够像FontWeight,FontSize等一样明确地定义它.
[更新]
我正在将此样式应用于Label控件.这是我的主要问题.您似乎无法在Label中为文本加下划线.更改为TextBlock(感谢gix),一切都很好.
WPF和Silverlight丰富的表现能力意味着像我这样的开发人员现在会更频繁地与平面设计师密切合作,就像我下一个项目中的情况一样.
有没有人有任何提示和经验(从两个角度来看)让这个更顺利?
例如,当我最近向设计师提到源代码控制时,我很快就被告知你无法获取控制图形,图像等,所以这是浪费时间.所以我回答:好吧,但是,WPF/Silverlight中的XAML文件怎么样?
Scott Hanselman在播客中谈到了这个话题,但他更多地关注这些工具,而我对通信问题/方面更感兴趣.
多年来,我一直是Juval Lowy在.NET开发方面的教学和指导的崇拜者.他还写了我最喜欢的书之一:Programming .NET Components.
然而,在最近的DotNet Rocks播客(2010年1月)讨论WCF/COM和.NET时,他发表了一些令我惊讶的评论:
JuvalLöwy: ..... 在.NET中,看,这里的每个类都是COM对象.我们知道.事实上,它远远超过COM,因为我们有git编译,我们有垃圾收集,我们有安全堆....
卡尔富兰克林:嗯,你应该澄清一下.我的意思是,每个对象都不是COM对象.每个对象都具有COM对象的功能,但.NET Framework不是COM库.
JuvalLöwy: 不,不.首先,.NET实际上是建立在COM之上的.这都是COM下面的.
然后,在卡尔富兰克林要求澄清这一评论之后:
卡尔富兰克林:是的,我明白了.我的问题是基于COM构建的.NET?
JuvalLöwy:当然,所有COM都在下面.
Carl Franklin:不,我知道它是交织在一起的,而且是必需的,但是当你新建一个.NET对象时,你并没有创建一个COM对象.
JuvalLöwy:你正在创建一个.NET对象,但我所说的只是.NET构建在底层.这都是C++和COM.
Carl Franklin:它是C++,但你没有通过COM接口注册COM对象.除非你专门做到这一点,否则不是全部.
JuvalLöwy:但有些东西在下面使用COM,但这不是重点.忘记它是如何制作的.
你怎么看这些评论?
虽然我理解(并且已经确认)某些系统程序集是用非托管C++编写的,但是它们是"所有COM下面"也是有效的吗?
我是在假设完全可以编写与COM/ATL/ActiveX完全无关的.NET CLI兼容的C++程序集?
以下是相关播客的PDF文字记录.见第7页.
c# ×4
.net ×2
c++ ×2
wpf ×2
com ×1
comparison ×1
debugging ×1
distinct ×1
filesystems ×1
friend ×1
javascript ×1
linq ×1
localization ×1
logging ×1
oop ×1
silverlight ×1
string ×1
styles ×1
text ×1
windows ×1
xaml ×1