我正在构建一个网络应用程序,需要能够从正常的网络流量切换到zlib压缩流,即中流.我对这个问题的看法涉及布尔开关,当打开时会导致网络代码通过我可以IEnumerable<byte>输入的类传递所有数据,然后拉出解压缩的流,将其传递给现有的协议解析代码.
我看过的事情:
我非常喜欢和所有托管的解决方案,但是让我们拥有它......在.NET中是否存在这个库的任何其他实现,可能更适合我想要做的事情,或者我应该采用ZLib. NET并建立起来作为一个开始?
PS:
乔恩要求更多细节,所以在这里.
我正在尝试实施MCCP 2.这涉及在网络流中发送的信号,并且该信号之后的所有内容都是zlib压缩数据流.在上面的链接中,它们与它们的含义完全相同.无论如何,要清楚,我正在接收这个(客户端,而不是服务器),我已经从网络流中读出了一堆数据,并且切换将在此中间(在所有至少可能),所以任何解决方案都需要能够在接管NetworkStream之前将一些额外的数据输入其中(或者我手动输入其余的数据).
基本上,到目前为止我有以下内容:
class Foo {
public override bool Equals(object obj)
{
Foo d = obj as Foo ;
if (d == null)
return false;
return this.Equals(d);
}
#region IEquatable<Foo> Members
public bool Equals(Foo other)
{
if (this.Guid != String.Empty && this.Guid == other.Guid)
return true;
else if (this.Guid != String.Empty || other.Guid != String.Empty)
return false;
if (this.Title == other.Title &&
this.PublishDate == other.PublishDate &&
this.Description == other.Description)
return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,问题是:我有一个非必需字段Guid,这是一个唯一标识符.如果没有设置,那么我需要尝试根据不太准确的度量确定相等性,以尝试确定两个对象是否相等.这很好用,但它会弄得GetHashCode()一团糟......我应该怎么做呢?一个天真的实现将是这样的:
public override …Run Code Online (Sandbox Code Playgroud) 有没有理由使用Type参数而不是泛型,即:
// this...
void Foo(Type T);
// ...over this.
void Foo<T>();
Run Code Online (Sandbox Code Playgroud)
在我看来,泛型更有用,因为它们提供泛型约束和C#4.0,逆变和协变,以及可能还有一些我不知道的其他功能.在我看来,通用形式具有所有优点,并且没有第一个也不具有的负面效果.那么,有没有你使用第一个的情况?
我在脚本中发现了一个错误,而且我正在弄清楚究竟是什么导致了这些问题.特别:
"49px" < 50 === false
Run Code Online (Sandbox Code Playgroud)
我在这里可以想到两种不同的转换:
49 < 50 === true
"49px" < "50" === true
"49" < 50 === true // just for the hell of it
Run Code Online (Sandbox Code Playgroud)
我修复它:
parseInt("49px") < 50 === true
Run Code Online (Sandbox Code Playgroud)
那为什么评估为假?到底发生了什么?
我花了好几个小时试图调试由以下代码引起的内存不足错误:
for ($i = 1; i <= 4; $i++) {
$allowed[] = $type.'_'.$i;
}
Run Code Online (Sandbox Code Playgroud)
哪个PHP好好进入:
for ($i = 1; 'i' <= 4; $i++) {
$allowed[] = $type.'_'.$i;
}
Run Code Online (Sandbox Code Playgroud)
这会导致无限循环,最终由于附加到阵列而导致内存不足错误.PHP将生成通知级别错误,我可以更改我的错误报告级别以显示这些但我正在处理第三方应用程序,这种应用程序倾向于生成足够的这些,这不是真正可行的解决方案.
有没有办法捕获这些非常简单的错误?具有讽刺意味的是,如果你做了类似的事情constant('i')并明确要求它,它会产生警告而不是通知,这种行为将是理想的.
作为基于测试的开发的新手,这个问题一直困扰着我.多少是太多了?应该测试什么,应该如何测试,以及为什么要进行测试?给出的例子是在C#中使用NUnit,但我认为问题本身与语言无关.
以下是我自己的两个当前示例,对通用列表对象进行测试(使用字符串进行测试,初始化函数添加三个项目{"Foo", "Bar", "Baz"}):
[Test]
public void CountChanging()
{
Assert.That(_list.Count, Is.EqualTo(3));
_list.Add("Qux");
Assert.That(_list.Count, Is.EqualTo(4));
_list[7] = "Quuuux";
Assert.That(_list.Count, Is.EqualTo(8));
_list.Remove("Quuuux");
Assert.That(_list.Count, Is.EqualTo(7));
}
[Test]
public void ContainsItem()
{
Assert.That(_list.Contains("Qux"), Is.EqualTo(false));
_list.Add("Qux");
Assert.That(_list.Contains("Qux"), Is.EqualTo(true));
_list.Remove("Qux");
Assert.That(_list.Contains("Qux"), Is.EqualTo(false));
}
Run Code Online (Sandbox Code Playgroud)
代码是相当自我评论的,所以我不会深入研究正在发生的事情,但这种事情是否过于遥远?Add()并且Remove()当然是单独测试的,那么我应该用这些类型的测试达到什么水平?我应该进行这类测试吗?
我有以下功能(这是不正确的):
private void TreeView_DragDrop(object sender, DragEventArgs e)
{
TreeNode CurrentNode =
TreeView.GetNodeAt(e.X - this.Left - NotesView.Left,
e.Y - this.Top - NotesView.Top);
// [snip]...
}
Run Code Online (Sandbox Code Playgroud)
但这是不正确的,因为它没有考虑到表单装饰......我确信除了硬编码之外还有更好的方法来做到这一点(无论如何,这将是错误的,取决于几个这样的事情,如作为Vista vs XP vs Win2k),但我找不到它.
这个问题说明我的问题正是,但我使用的自定义配置节app.config用ConfigurationManager,因此该解决方案提出了有不适...
基本上,我的问题是当ClickOnce更新应用程序时,它会使用新的app.config安装到不同的目录中,从而删除所做的任何更改.我的应用程序使用app.config来保存应用程序设置,所以这非常糟糕......合并的更新将非常出色(类似于在另一个问题中实现的),但是在这一点上几乎任何自动化都会很好.
或者我应该只为app.config文件使用设置位置而不是尝试使用默认位置?
我想知道在这些情况下何时调用析构函数,如果它是在主UI线程上调用它?
假设我有以下代码,什么时候会调用析构函数,它会等到我完成所有函数调用之后?
private void Foo()
{
MyObject myObj = new MyObject();
DoSomeFunThingsWithMyObject(myObj);
myObj = new MyObject(); //is the destructor for the first instance called now?
DoLongOminousFunctionality(myObj);
}
//Or will it be called after the DoLongOminousFunctionality?
Run Code Online (Sandbox Code Playgroud)
如果线程在myObj = new MyObject()中断,或者Destructor调用等待直到Thread空闲,那么这只是我感兴趣的东西.
谢谢你的信息.
来自MSDN:
通过消除不必要的强制转换,隐式转换可以提高源代码的可读性.但是,因为隐式转换可以在程序员指定它们的情况下发生,所以必须注意防止令人不快的意外.通常,隐式转换运算符不应该抛出异常并且永远不会丢失信息,以便在没有程序员意识的情况下可以安全地使用它们.如果转换运算符不符合这些条件,则应将其标记为显式.
虽然我并不反对任何特定的观点,并且我同意这一切都非常好,但有没有一个理由可以保证打破关于隐式转换而不抛出异常的部分?
我面前的具体案例是:
FooCollection).现在,我正在讨论是否包含来自FooCollection=> 的隐式转换Foo来隐藏这个小实现细节,但这种转换只有在集合中有一个项目时才有效.
Exception在这种情况下可以抛出吗?或者我应该使用显式演员代替吗?关于我如何处理这个的任何其他想法(不,由于实现细节,我不能只使用两个函数)?
编辑:我觉得值得注意的是,FooCollection没有实现任何接口或实际扩展Collection名称可能意味着,因此基于LINQ的答案是无用的.此外,虽然集合确实实现了数字索引,但它并不是处理集合的最直观方式,因为它主要依赖于命名索引.
c# ×7
.net ×2
app-config ×1
casting ×1
clickonce ×1
constants ×1
destructor ×1
equals ×1
explicit ×1
generics ×1
gethashcode ×1
iequatable ×1
implicit ×1
javascript ×1
php ×1
tdd ×1
winforms ×1
zlib ×1