小编Gro*_*roo的帖子

创建可扩展属性类(OOP)

我有一个应用程序,它支持某些设备的多种类型和版本.它可以连接到这些设备并检索各种信息.

根据设备的类型,我有(除其他外)一个可以包含各种属性的类.某些属性对所有设备都是通用的,有些属性对于特定设备是唯一的.

此数据序列化为xml.

实现一个类的首选方法是什么,它将支持这些设备的未来版本中的未来属性,以及向后兼容以前的应用程序版本?

我可以想到几种方法,但我发现它们都不是很好:

  • 使用一组名称 - 值对:
    • 专业人士:良好的向后兼容性(我的应用程序的xml和以前版本)和可扩展性,
    • 缺点:没有类型安全,没有intellisense,需要实现自定义xml序列化(处理不同的value对象)
  • 为每个新设备创建派生属性类:
    • 专业人士:类型安全
    • 缺点:必须使用XmlInclude或自定义序列化来反序列化派生类,不与以前的xml架构向后兼容(虽然通过实现自定义序列化我可以跳过未知属性?),需要强制转换来访问派生类中的属性.
  • 另一种方法呢?

顺便说一句,我正在使用C#.

c# oop inheritance xml-serialization

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

调试多线程应用程序的建议

我在Visual Studio 2008中逐步调试多线程.NET应用程序时遇到问题.

随着每个阶梯线,Visual Studio变得越来越慢(跳转到下一行需要越来越多的时间)并且通常在几行之后挂起(我得到"Visual Studio忙"气球提示),我需要停止调试.

我怀疑问题是由于应用程序连接了几个TCP/IP客户端,这意味着每次我创建一个断点,他的网络缓冲区都会被填满,直到我继续我的应用程序.每当我使用F10步骤到下一行代码时,Visual Studio会很快唤醒所有其他线程以便它们处理输入数据.

有没有人有这些问题的经验,以及如何避免这些问题的建议?

.net debugging multithreading visual-studio

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

.NET 中的后续写入是否可以由运行时或处理器重新排序?

我有不可变的对象,我希望延迟计算其哈希码。我已经实施了

private bool _HasHashCode = false;
private int _HashCode;
public override int GetHashCode()
{
    if (_HasHashCode)
        return _HashCode;

    long hashCode;
    unchecked
    {
        hashCode = Digits;
        hashCode = (hashCode*397) ^ XI;
        hashCode = (hashCode*397) ^ YI;
        hashCode = (int) ( hashCode % Int32.MaxValue);
    }

    // is it possible that these two write instructions
    // get reordered on a certain .NET/CPU architecture 
    // combination:

    _HashCode = (int)hashCode;
    _HasHashCode = true;

    return _HashCode;
}
Run Code Online (Sandbox Code Playgroud)

我的推理是,32 位 _HashCode 成员是 32 位,写入它是原子的,因此即使由于设置 _HasHashCode 属性时的竞争条件而运行两次计算也没关系 …

c# memory-model thread-safety

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

我用字符串连接后,C#后面的数字消失了

我有以下问题:在我的数字添加一个字符串之后,该点之后的第二个数字就像这样消失了

 var needed_product = sets * (2 * price_bananas) + 
                      sets * (4 * price_eggs) + 
                      sets * (0.2 * price_berries);

 var difference = Math.Abs(needed_product - amount_cash);

 if (amount_cash>=needed_product)
 {
    Console.Write("Ivancho has enough money - it would cost " + "{0:F2}", 
      needed_product + "lv."); 
 }
Run Code Online (Sandbox Code Playgroud)

输出是37,4,它应该是37,40,逗号后面还有一位数.我该如何解决这个问题?当我打印它而不添加最后一个字符串时,整数的输出是正确的.

c#

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

如果不使用const,则在RAM中进行不必要的分配,尽管放置在Flash绝对地址中

我正在使用GCC。我在Flash中通过.ld链接器文件创建了一个SECTION,我在其中放置了一些数据(704字节),并带有指令__attribute__((section... Data似乎在Flash中,但是如果我const在声明数据时不使用关键字,则会在RAM中分配相同的空间。

如果我不使用constRAM,则不会使用-但我注意到增加了对Flash的使用,因为它被分配了两次!

链接器文件:

FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 14K
USER_DATA_FLASH (rx)      : ORIGIN = 0x8003800, LENGTH = 2K
}

SECTIONS
{ /* placing my named section at given address: */
  .my_block 0x8003800 :
 {
  KEEP(*(.UserDataSector)) 
 } > USER_DATA_FLASH
}
Run Code Online (Sandbox Code Playgroud)

数组声明具有初始化程序:

mytab_type  __attribute__((section (".UserDataSector "))) progr16[16]=
{ 
    { {LIST1,LIST2....
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我没有使用const。假设这progr16被强制放在闪存中,并且如果在调试过程中我使用内存浏览器检查的话,它看起来确实在那里。但它似乎也占用RAM

FLASH    RAM
text     data    bss   dec     
9268     772     1948  11988    
Run Code Online (Sandbox Code Playgroud)

如果我添加const关键字:

FLASH    RAM
text     data    bss …
Run Code Online (Sandbox Code Playgroud)

c attributes gcc const stm32

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

SQL获取10个最大的数字

我试图从奖金表中检索10个最大的数字.

但我收到此错误消息:

Incorrect syntax near 'LIMIT'
Run Code Online (Sandbox Code Playgroud)

我的代码:

SELECT cust_nr, period1_bonus FROM bonus ORDER BY period1_bonus DESC LIMIT 10
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

4
推荐指数
2
解决办法
449
查看次数

在字符串集上找到输入的字谜..?

给定一组字符串(大集合)和输入字符串,您需要有效地找到输入字符串的所有字符.您将使用什么数据结构.使用它,你会如何找到字谜?

我想到的是这些:

  1. 使用地图

    a)消除所有字母多于/少于输入的字母.

    b)将输入字符放在地图中

    c)遍历每个字符串的地图,看看是否所有字母都带有计数.

  2. 使用尝试

    a)将所有具有正确字符数的字符串放入trie中.

    b)遍历每个分支,如果输入中包含字母,则更深入.

    c)如果叶子到达这个词是一个字谜

有人能找到更好的解决方案吗?

您在上述方法中发现了哪些问题?

algorithm map trie

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

C#方法能够处理/接受不同的类类型

我有一个方法接受一个简单的类对象,并构建一个API调用中使用的URL.我希望这个方法能够处理/接受相似但具有不同属性的不同类类型.

public class ClientData
{
   public string Name {get; set;}
   public string Email {get; set;}
   ...
}

public class PaymentData
{
   public decimal PaymentAmount {get; set;}
   public string Description {get; set;}
   ...
}
Run Code Online (Sandbox Code Playgroud)

以下是两个示例方法.如你所见,它们非常相似.最好是将这些实现为接受不同参数的不同方法,还是可以编写一个可以处理参数对象差异的方法?

public string BuildApiCall(ClientData clientDataObject)
{
  StringBuilder sb = new StringBuilder();
  sb.Append("http://mytestapi.com/");
  sb.append("name=" + clientDataObject.Name);
  sb.append("email=" + clientDataObject.Email);
  return sb.ToString();
}

public string BuildApiCall(PaymentData paymentDataObject)
{
  StringBuilder sb = new StringBuilder();
  sb.Append("http://mytestapi.com/");
  sb.append("payment=" + paymentDataObject.PaymentAmount );
  sb.append("description=" + paymentDataObject.Description );
  return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

c#

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

将 .NET 外部 dll 合并为一个可执行文件

这是一个简单的问题。如果 Newtonsoft.Json.dll 不在程序文件夹中,我就无法运行我的程序。为什么这个?我尝试添加引用,将文件添加到项目根目录,添加到资源文件夹,但没有任何效果。如何在程序文件夹中没有Newtonsoft.Json.dll的情况下运行程序?我正在 Windows 窗体应用程序中进行开发。

更新

问题解决了,感谢spender给我介绍了ILMerge,这是一个非常好的NuGet包,可以将第三方dll组合成一个可执行的二进制文件。对于想要制作独立应用程序的人,只需使用 ILMerge。快速、简单且非常有用。拜拜!

c# ilmerge json visual-studio winforms

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

带有两个圆括号对的 C 函数?

我很抱歉标题不好,但除了“我不明白这段代码”之外,我没有想到更好的东西。请随时提出修改建议。

我正在阅读这段代码。我从未见过这样的 C 函数:

static void
VL_XCAT(_vl_vlad_encode_, SFX)
(TYPE * enc,
 TYPE const * means, vl_size dimension, vl_size numClusters,
 TYPE const * data, vl_size numData,
 TYPE const * assignments,
 int flags)
{
    // function body
}
Run Code Online (Sandbox Code Playgroud)

特别是我对(_vl_vlad_encode_, SFX). 据了解,我见过的所有函数头都只有一对“圆括号”(函数的参数),而这里有两对。

第一个是什么意思?我认为这是与以后的调用_vl_vlad_encode_f_vl_vlad_encode_d等不出现其他地方在库中的代码,但我不明白它们是如何连接的。

c vlfeat

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