似乎C#3.0对象初始化程序语法允许在存在无参数构造函数时排除构造函数中的打开/关闭括号对.例:
var x = new XTypeName { PropA = value, PropB = value };
Run Code Online (Sandbox Code Playgroud)
相反:
var x = new XTypeName() { PropA = value, PropB = value };
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么构造函数打开/关闭括号对后面是可选的XTypeName?
也许我在展示我对C#或.NET框架的一些常用功能的无知,但我想知道是否有一种本机支持的方法来创建类型别名,如EmailAddress别名,string但我可以扩展它我自己的方法如何bool Validate()?
我知道using x = Some.Type;别名,但这些不是全局的,也不提供类型安全性,即可以string在当前文件中换出普通的别名.我希望我EmailAddress是自己的类型,独立,不能与string它阴影的类型互换.
我目前的解决方案是public sealed partial EmailAddress : IEquatable<EmailAddress>, IXmlSerializable使用T4模板生成类,生成样板隐式字符串转换运算符和其他类似的东西.这对我来说很好,并且给了我很大的灵活性,但在我的脑海里,我必须生成如此丰富的样板代码才能做一些像创建强类型别名一样简单的事情.
也许除了代码生成之外,这是不可能的,但我很好奇,如果其他人尝试过类似于他们的设计和你的经历.如果没有别的,也许这可以作为假设未来版本的C#中的这种别名功能的一个很好的用例.谢谢!
编辑:我想要的真正价值是能够使用表示数据的不同类型/格式的原始类型获得类型安全性.例如,a EmailAddress和a SocialSecurityNumber和a PhoneNumber,所有这些都string用作它们的基础类型,但它们本身并不是可互换的类型.我认为这会让你获得更具可读性和自我记录的代码,更不用说更多方法过载可能性的附加好处,而不是模糊不清.
有没有人看到下面关于循环代码的任何明显的东西,我没有看到为什么这不能被VS2012的C++编译器自动矢量化?
所有编译器给我的是info C5002: loop not vectorized due to reason '1200'当我使用/Qvec-report:2命令行开关时.
原因1200在MSDN中记录为:
循环包含阻止矢量化的循环携带数据依赖性.循环的不同迭代相互干扰,使得对循环进行矢量化将产生错误的答案,并且自动矢量化器不能向自身证明不存在这样的数据依赖性.
我知道(或者我很确定)没有任何循环传输的数据依赖,但我不确定是什么阻止了编译器实现这一点.
这些source和dest指针不会重叠,也不会为同一个内存设置别名,我正在尝试为编译器提供该提示__restrict.
pitch总是一个正整数值,类似于4096,取决于屏幕分辨率,因为这是一个8bpp-> 32bpp渲染/转换功能,逐列操作.
byte * __restrict source;
DWORD * __restrict dest;
int pitch;
for (int i = 0; i < count; ++i) {
dest[(i*2*pitch)+0] = (source[(i*8)+0]);
dest[(i*2*pitch)+1] = (source[(i*8)+1]);
dest[(i*2*pitch)+2] = (source[(i*8)+2]);
dest[(i*2*pitch)+3] = (source[(i*8)+3]);
dest[((i*2+1)*pitch)+0] = (source[(i*8)+4]);
dest[((i*2+1)*pitch)+1] = (source[(i*8)+5]);
dest[((i*2+1)*pitch)+2] = (source[(i*8)+6]);
dest[((i*2+1)*pitch)+3] = (source[(i*8)+7]);
}
Run Code Online (Sandbox Code Playgroud)
每个周围的parens source[]都是函数调用的残余,我在这里已经省略了,因为在没有函数调用的情况下,循环仍然不会以最简单的形式自动向量化.
编辑:
我已经将循环简化为最简单的形式,我可以:
for …Run Code Online (Sandbox Code Playgroud) c++ vectorization compiler-optimization visual-c++ visual-c++-2012
在测试我在Windows 7 Ultimate x64上编写的UDP多播服务器时,我遇到了一个最奇怪的事情.在背景中使用foobar2000播放音乐显着提高了服务器的传输速率,同时也导致了轻微的数据包丢失.关闭音乐会立即将传输速率降低到可接受的水平以下,但也会造成0个数据包丢失.(我有一个客户端应用程序与服务器通信并报告未确认的数据包)
我知道Vista的(以及更高)限制行为使媒体和网络应用程序很好地协同工作,但我当然没想到播放音乐会提高网络性能,也不会让网络性能降低如此显着.
从我的服务器应用程序的代码角度来看,我能做些什么,以便无论是否在Vista上播放音乐,它都能始终如一地执行?我当然希望避免告知我的所有客户如何调整他们的注册表以获得可接受的传输速率,并且还希望避免让他们简单地"播放音乐"以获得可接受的传输速率.在我看来,应用程序应该"正常工作".
我认为解决方案涉及过程优先级,MMCSS或可能的其他一些模糊的Windows API调用,以使其在此处执行The Right Thing(TM).
此外,抱歉,创建一个可重现的测试用例是一项非常重要的工作.仅当物理NIC的驱动程序正在主动执行工作且无法使用环回接口再现时,才会发生限制行为.人们需要一个客户端实现,一个服务器实现和物理网络硬件来测试.
我有一个Go程序托管一个简单的HTTP服务,localhost:8080因此我可以nginx通过proxy_pass指令将我的公共主机连接到它,作为反向代理服务我网站的部分请求.这一切都很好,没有问题.
我想将Go程序转换为在Unix域套接字而不是本地TCP套接字上托管HTTP服务,以提高安全性并减少TCP的不必要的协议开销.
问题:问题是bind()即使在程序终止之后,Unix域套接字仍然无法重用.第二次(以及之后)我运行Go程序它会以致命错误退出"address already in use".
unlink()服务器关闭时,常见的做法是Unix域套接字(即删除文件).但是,这在Go中很棘手.我的第一次尝试是defer在我的主函数中使用该语句(见下文),但如果我用CTRL-C这样的信号中断进程,它就不会运行.我想这是可以预料的.令人失望,但并非出乎意料.
问题:unlink()当服务器进程关闭时(优雅或不正常),是否有关于套接字的最佳实践?
这是我的一部分func main(),启动服务器监听参考:
// Create the HTTP server listening on the requested socket:
l, err := net.Listen("unix", "/tmp/mysocket")
if err != nil {
log.Fatal(err)
} else {
// Unix sockets must be unlink()ed before being reused again.
// Unfortunately, this defer is not run when a signal is received, e.g. CTRL-C.
defer func() { …Run Code Online (Sandbox Code Playgroud) 我正在C#中编写UDP多播客户端/服务器对,我需要50-100μsec(微秒)的延迟来限制服务器传输速率.这有助于避免重大数据包丢失,还有助于防止磁盘I/O绑定的客户端过载.请不要建议Thread.Sleep或Thread.SpinWait.我不会问我是否需要其中任何一个.
我的第一个想法是使用某种高性能计数器,然后做一个简单的while()循环来检查已用时间,但我想避免这种情况,因为它感觉很笨拙.那不会也会占用服务器进程的CPU利用率吗?
跨平台解决方案的奖励积分,即不是Windows特定的.先谢谢你们!
据我所知,32位机器上的.NET内存模型保证32位字写入和读取是原子操作,但不能在64位字上提供这种保证.我已经编写了一个快速工具来演示这种对Windows XP 32位操作系统的影响,并且得到的结果与该内存模型描述一致.
但是,我已经使用了相同工具的可执行文件并在Windows 7企业版64位操作系统上运行它,结果却截然不同.两台机器都是相同的规格,只是安装了不同的操作系统.我原以为.NET内存模型可以保证在64位操作系统上对32位和64位字的写入和读取都是原子的.我发现结果与BOTH假设完全相反.在此操作系统上,32位读取和写入未被证明是原子的.
有人可以向我解释为什么在64位操作系统上失败了吗?
工具代码:
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var th = new Thread(new ThreadStart(RunThread));
var th2 = new Thread(new ThreadStart(RunThread));
int lastRecordedInt = 0;
long lastRecordedLong = 0L;
th.Start();
th2.Start();
while (!done)
{
int newIntValue = intValue;
long newLongValue = longValue;
if (lastRecordedInt > newIntValue) Console.WriteLine("BING(int)! {0} > {1}, {2}", lastRecordedInt, newIntValue, (lastRecordedInt - newIntValue));
if (lastRecordedLong > newLongValue) Console.WriteLine("BING(long)! {0} > {1}, {2}", lastRecordedLong, newLongValue, …Run Code Online (Sandbox Code Playgroud) 下面的代码使用PRNG(伪随机数生成器)Random类为初始临时密码生成密码字符,而不是RNGCryptoServiceProvider应该使用的密码安全性更高.
但是,它使用RNGCryptoServiceProvider生成的PRNG的种子,所以我想这也许值得的东西,而不是根据一天中的当前时间播种是典型的做法使用PRNG那里的安全是不是问题的时候.
我的问题是:为了破坏密码生成系统并猜测新用户的密码,这种攻击方法有多容易或多难?
// Generate 4 random bytes.
byte[] randomBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(randomBytes);
// Convert 4 bytes into a 32-bit integer value.
int seed = (randomBytes[0] & 0x7f) << 24 | randomBytes[1] << 16 | randomBytes[2] << 8 | randomBytes[3];
// Now, this is real randomization.
Random random = new Random(seed);
Run Code Online (Sandbox Code Playgroud)
然后代码继续random.Next()用于生成填充密码字符串的字符.
免责声明:此代码不属于我的发明.不要因为它而责备我,也不提供如何解决它的建议.我知道如何解决它,我知道它很糟糕.不要浪费时间回复.任何有关此效果的评论或答案都将被标记为垃圾邮件.我只在我们的代码中找到它并且对它的"安全"属性感到好奇.