小编Fli*_*ter的帖子

覆盖==运算符.如何比较null?

可能重复:
如何在没有无限递归的情况下检查'=='运算符重载中的空值?

对此可能有一个简单的答案......但它似乎在逃避我.这是一个简化的例子:

public class Person
{
   public string SocialSecurityNumber;
   public string FirstName;
   public string LastName;
}
Run Code Online (Sandbox Code Playgroud)

让我们说,对于这个特定的应用程序,如果社会安全号码匹配,并且两个名称都匹配,那么我们指的是同一个"人"是有效的.

public override bool Equals(object Obj)
{
    Person other = (Person)Obj;
    return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
        this.FirstName == other.FirstName &&
        this.LastName == other.LastName);
}
Run Code Online (Sandbox Code Playgroud)

为了保持一致,我们还为团队中不使用该.Equals方法的开发人员覆盖==和!=运算符.

public static bool operator !=(Person person1, Person person2)
{
    return ! person1.Equals(person2);
}

public static bool operator ==(Person person1, Person person2)
{
    return person1.Equals(person2);
}
Run Code Online (Sandbox Code Playgroud)

好又花花公子,对吧?

但是,当Person对象发生时会发生什么null

你不能写:

if (person == null)
{
    //fail! …
Run Code Online (Sandbox Code Playgroud)

.net c# null overloading operator-keyword

132
推荐指数
4
解决办法
6万
查看次数

.Net与GraphicsPath.Widen()相反

我需要与GraphicsPath.Widen().Net 中的方法相反:

public GraphicsPath Widen()
Run Code Online (Sandbox Code Playgroud)

Widen()方法不接受否定参数,因此我需要等效的Inset方法:

public GraphicsPath Inset()
Run Code Online (Sandbox Code Playgroud)

您可以在开源Inkscape应用程序(www.Inkscape.org)中执行此操作,方法是转到菜单并选择"Path/Inset"(插入量存储在Inkscape属性对话框中).由于Inkscape是开源的,所以应该可以在C#.Net中执行此操作,但我不能在生命中使用Inkscape C++源代码(我只需要这个函数,所以我不能证明学习C++是正确的完成这个).

基本上,我需要一个带有此签名的GraphicsPath扩展方法:

public static GraphicsPath Inset(this GraphicsPath original, float amount)
{
   //implementation
}
Run Code Online (Sandbox Code Playgroud)

正如签名所述,它将采用一个GraphicsPath对象和.Inset()路径传递的数量......就像今天的Inkscape一样.如果它简化了任何问题,那么所讨论的GraphicsPath都是从该.PolyBezier方法创建的(并且没有其他内容),因此除非您想要完整性,否则不需要考虑rects,省略号或任何其他形状.

不幸的是,我没有使用C++代码的经验,所以我几乎不可能遵循Inkscape中包含的C++逻辑.

.

[编辑:]根据要求,这里是"MakeOffset"Inkscape代码.对于Inset,第二个参数(double dec)将为负,并且该参数的绝对值是引入形状的量.

我知道这里有很多依赖项.如果您需要查看更多的Inkscape源文件,请访问:http://sourceforge.net/projects/inkscape/files/inkscape/0.48/

int
Shape::MakeOffset (Shape * a, double dec, JoinType join, double miter, bool do_profile, double cx, double cy, double radius, Geom::Matrix *i2doc)
{
  Reset (0, 0);
  MakeBackData(a->_has_back_data);

    bool done_something = false;

  if (dec == 0)
  {
    _pts …
Run Code Online (Sandbox Code Playgroud)

c# open-source graphicspath

18
推荐指数
2
解决办法
5618
查看次数

SVN Endless Loop - [文件]"在存储库中不存在"

这一直困扰着我一个星期.

SVN一直告诉我某个文件" does not exist in repository".

精细.我们只是删除它.忘掉它.忽略它.随你.我并不关心这个文件(特别是如果它在夜间办理登机手续时仍然失败).

最离奇的部分?"恢复"实际上将从存储库中恢复文件,因此它在那里(已损坏,可能?).

......这必须是锦上添花.如果我通过Windows资源管理器删除该文件,SVN将从存储库中恢复该文件,并在该状态之后存储库中不存在该文件.WTF?

有没有人知道如何摆脱这个?

我已经尝试过清理,转换,删除和其他任何可以想象的事情,但是这个让我难过.

感谢您提供的任何提示......

tortoisesvn

18
推荐指数
1
解决办法
1万
查看次数

.Net扩展方法(此字符串Foo)仅部分可见

这是关于.Net中扩展方法可见性(特别是C#)的问题,以及为什么intellisense可能有效,但编译器在同一段代码上失败.

想象一下......

我有.Net 3.5类库,由一堆对象和一个Extension Methods类组成.这是方法之一:

namespace MyApp.Extensions
{
    public static class ExtensionMethods
    {
        public static string ToTitleCase(this string Origcase)
        {   string TitleCase = Origcase;
            ... implementation ...
            return TitleCase;
        }
    }
Run Code Online (Sandbox Code Playgroud)

要在类库本身中使用扩展方法,需要其中一个方法的每个类都需要指定:

using MyApp.Extensions;
Run Code Online (Sandbox Code Playgroud)

因为这是与库的其余部分不同的命名空间.所有这一切都很好.

现在,.Net 2.0网站正确引用了这个库,类文件希望使用该库.所以它声明它是:

using MyApp.Extensions
Run Code Online (Sandbox Code Playgroud)

SEEMS工作正常,当键入字符串时,Intellisense确实看到悬挂在字符串实例上的扩展方法:

http://www.flipscript.com/test/ToTitleCase.jpg

当计划结合在一起时,我喜欢它!

然而,这是快乐的结束.

尝试构建网站时,构建失败,并显示以下消息:

http://www.flipscript.com/test/titlecaseerror.jpg

尝试将ExtensionMethods类直接复制到Web项目时,构建再次失败.这一次,因为没有预料到"这个"这个词.

奇怪的是,扩展方法确实可以作为常规静态方法使用:

http://www.flipscript.com/test/titlecaseok.jpg

...并且Build工作得很好(所以问题实际上并不是"this"关键字).事实上,无论ExtensionMethods类是在类库还是Web站点中,构建都可以工作.

换句话说,这确实解决了问题,构建将成功.

......但解决方案很糟糕.

问题:在这种情况下,是否有某种秘密技巧可以使扩展方法正常工作?

http://www.flipscript.com/test/ToTitleCase.jpg

我已经尝试过"命名空间System.Runtime.CompilerServices"技巧,但这似乎没有帮助.

什么会导致Intellisense正确地看到扩展方法,并且编译器会失败?

注意:设计的示例变量应该被称为'name'而不是'FirstName',但是你明白了.

c# methods intellisense

5
推荐指数
1
解决办法
1035
查看次数

如何在C#中减去一行的字节数

这真的很奇怪.有谁能解释一下?

此代码不起作用:

const byte ASC_OFFSET = 96;
string Upright = "firefly";
byte c7 = (byte)Upright[6] - ASC_OFFSET;
//Cannot implicitly convert type 'int' to 'byte'.
Run Code Online (Sandbox Code Playgroud)

此代码也不起作用:

const byte ASC_OFFSET = 96;
string Upright = "firefly";
byte c7 = (byte)Upright[6] - (byte)ASC_OFFSET;
//Cannot implicitly convert type 'int' to 'byte'.
Run Code Online (Sandbox Code Playgroud)

然而,将减法放在一个单独的行上工作得很好:

const byte ASC_OFFSET = 96;
string Upright = "firefly";
byte c7 = (byte)Upright[6];
c7 -= ASC_OFFSET;
Run Code Online (Sandbox Code Playgroud)

我不介意将这些陈述分开,如果我必须......但我不得不怀疑......

为什么?

c# compiler-construction language-construct

5
推荐指数
3
解决办法
2929
查看次数

SQL Server 2008非聚簇索引是否包含聚簇索引字段?

好的,我需要再次拼出这个.我已经在线阅读了这些文章,但我还没有找到明确的答案.

在SQL Server 2008中,我有一个"核心"表,其中包含大约50,000条记录和大量读取活动,在所有查询中以相同的方式使用.此数据每月更新一次,每秒读取数百次.

数据在字段上具有聚簇索引,因为它们经常被访问.假设聚集索引是:

集群指数

Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
Run Code Online (Sandbox Code Playgroud)

现在,没有比这更多的数据,所以将额外的几列放入"包含的列"是有意义的,但SQL Server不允许在聚集索引上包含列.

因此,我们有第二个索引,其字段与Clustered Index基本相同,其他列为"Included Columns".但是,从我读过的内容来看,我认为这可能是多余的?

覆盖索引(非群集)

Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
Run Code Online (Sandbox Code Playgroud)

包括栏目

Field6 varchar(96)
Field7 varchar(96)
Run Code Online (Sandbox Code Playgroud)

非聚集索引ALREADY是否具有其中定义的聚簇索引的列?

如果是这样,那么如何使用NO列创建第二个索引(除了已经在聚簇索引中的内容)?换句话说,我想说"这个索引与聚集索引完全相同......带有几个包含的列".

或者,将所有列放入聚集索引(包括不识别记录的两个列)会更好吗?varchar列确实更频繁地更新(每天几次而不是每月一次),所以我希望将它们保留在聚集索引之外,但我认为它们足够深,它们不会影响索引树足以在发生更改时导致任何重新平衡.

那么,是否有一种有效的方法来设置这些索引,以便该表的所有列都可以通过索引获得而无需返回到表中?

sql indexing clustered-index sql-server-2008

5
推荐指数
2
解决办法
3181
查看次数

如何在C#中为ASCII 127定义字符或字符串常量?

如何创建包含单字符ASCII 127的字符或字符串常量?

// Normal printing character - no problems
const char VPIPE = '|';
//error "The expression being assigned to 'DEL' must be constant"
const char DEL = new string(127, 1); 
Run Code Online (Sandbox Code Playgroud)

如果常量是字符串而不是字符也可以:

const string VPIPE = "|";
const string DEL = "???";
Run Code Online (Sandbox Code Playgroud)

我知道ASCII 127不是你可以在键盘上"输入"的东西,但是必须有一种方法可以从中创建一个字符串或char常量(或者使用我没有找到的内置字符串).

c# string ascii constants literals

4
推荐指数
3
解决办法
1万
查看次数

快速:设置int的前2位

这实际上对谷歌来说相当棘手.

你如何设置(按位或)32位int的前两位?

我从我尝试的所有内容中收到编译器警告.

c# int bit-manipulation

1
推荐指数
1
解决办法
616
查看次数

内部方法代码重用

假设您有两个完全独立的项目:项目1和项目2.一个是Windows应用程序,一个是Web应用程序.

如果两个项目都需要A,B和C类用于内部使用,那么在两个项目之间的类中推广代码重用的最佳方法是什么(特别是代码随着时间的推移而更新)?

  • 强制这些类是公共的,打破整洁的公共接口,并从一个项目到另一个项目进行引用(哎呀!)
  • 为共享组件创建第三个项目,然后仅在内部为主项目使用它们(哎呀!)
  • 将项目1中的类"添加"到项目2(在项目文件夹之外)并接受项目2将不具有在其项目文件夹中构建所需的所有类(可接受但不理想)
  • 依赖于复制和粘贴,源代码控制交叉引用或其他一些非编程特技.
  • 其他一些技术目前正在躲避我(手指交叉......)

请注意,这些是两个项目所必需的相同的INTERNAL辅助类.

c# code-reuse internal

0
推荐指数
1
解决办法
930
查看次数