小编Mik*_*kis的帖子

属性和命名/可选构造函数参数不起作用

我有自定义属性,如下所示:

  [AttributeUsage(AttributeTargets.Field)]
  public class EnumDisplayAttribute : Attribute
  {
    public string Description { get; private set; }
    public string Code { get; private set; }

    public EnumDisplayAttribute(string description = null, string code = null)
    {
      Description = description;
      Code = code;
    }
  }
Run Code Online (Sandbox Code Playgroud)

两个构造函数参数都是可选的.

在像这样的字段上使用此属性时

  public enum TransactionType
  {
    [EnumDisplay(code: "B")] 
    Bill,
    [EnumDisplay(description: null, code: "C")]
    CashReceipt,
  }
Run Code Online (Sandbox Code Playgroud)

我没有在代码编辑器中看到任何波形,但我看到一个模糊的错误,没有任何文件行号列.错误消息是:

错误CS0182:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

单击该错误不会执行任何操作.也就是说,您不会导航到错误站点(显然,因为没有行号和列).

即使我像这样设置属性:

[EnumDisplay("This is a Bill")] 
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢它.

实际上,我被迫提供两个参数(已命名或未命名),以便将此属性用作属性.

当然,如果我将此属性用作常规类,如下所示:

var enumDisplayAttribute = new EnumDisplayAttribute();
enumDisplayAttribute = new EnumDisplayAttribute(description: "This is a …
Run Code Online (Sandbox Code Playgroud)

c# custom-attributes

22
推荐指数
2
解决办法
2万
查看次数

为什么我没有收到关于未初始化的只读字段的警告?

如果您忘记初始化私有或内部的只读成员,或者声明它的类是内部的,那么C#编译器就足以为您提供"永远不会分配字段"警告.但如果该类是公开的,并且只读成员是公共的,受保护的或内部保护的,那么就没有警告!

有谁知道为什么?

示例代码,用于说明发出警告的条件以及未发出警告的条件:

namespace Test1 
{ 
    class Test1
    { 
#if TRY_IT 
        public readonly int m; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 
        protected readonly int n; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 
        internal readonly int o; //OK: warning CS0649: Field is never assigned to, and will always have its default value 0 
        private readonly int p; //OK: warning CS0649: Field is …
Run Code Online (Sandbox Code Playgroud)

c# compiler-construction

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

CompletableFuture:等待第一个正常返回?

我有一些CompletableFutures,我想并行运行它们,等待正常返回的第一个.

我知道我可以CompletableFuture.anyOf用来等待第一次返回,但这将正常异常返回.我想忽略异常.

List<CompletableFuture<?>> futures = names.stream().map(
  (String name) ->
    CompletableFuture.supplyAsync(
      () ->
        // this calling may throw exceptions.
        new Task(name).run()
    )
).collect(Collectors.toList());
//FIXME Can not ignore exceptionally returned takes.
Future any = CompletableFuture.anyOf(futures.toArray(new CompletableFuture<?>[]{}));
try {
    logger.info(any.get().toString());
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

java java-8 completable-future

21
推荐指数
2
解决办法
6736
查看次数

永远不会调用Hibernate @PostLoad

看了很多论坛,但没有找到答案......简单的东西,用@PostLoad注释的方法永远不会被调用...通过@EntityListeners添加了监听器,但问题仍然存在.我正在使用基于SessionFactory的配置.

java orm hibernate

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

如何结合“选择”和“位置”

假设我有一个IEnumerable<X>,其中 的 一些实例X可以转换为Y,而有些则不能,并且想要一个IEnumerable<Y>, 只包含那些X可以转换为 的 es Y

例如,如果我有一个IEnumerable<int?>同时包含空值和非空值的 ,我可能需要一个IEnumerable<int>仅包含非空值的。

注意:请不要int?过于字面地理解这个例子;该解决方案应该适用于任何Xand ,其中和Y之间的差异不仅仅是类型差异或可空性差异。XY

我可以做到的一种方法如下:

public static void Main( string[] args )
{
    int?[] a = { null, 42, null, 5 };
    IEnumerable<int> ints = a //
            .Where( i => i.HasValue ) //
            .Select( i => i!.Value );
    foreach( var i in ints )
        Console.WriteLine( i );
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

虽然上面的代码有效,但我想将 …

c# linq

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

为什么不能重新启动Java Thread对象?

我知道不可能重新启动使用过的Java Thread对象,但是我没有找到解释为什么不允许这样做的原因.即使保证线程已经完成(参见下面的示例代码).

我不明白为什么start()(或者至少是restart())方法不能以某种方式将Thread对象的内部状态(无论它们是什么)重置为新建Thread对象时的相同值.

示例代码:

class ThreadExample {

  public static void main(String[] args){

    Thread myThread = new Thread(){
      public void run() {
        for(int i=0; i<3; i++) {
          try{ sleep(100); }catch(InterruptedException ie){}
          System.out.print(i+", ");
        }
        System.out.println("done.");
      }
    };

    myThread.start();

    try{ Thread.sleep(500); }catch(InterruptedException ie){}
    System.out.println("Now myThread.run() should be done.");

    myThread.start(); // <-- causes java.lang.IllegalThreadStateException

  } // main

} // class
Run Code Online (Sandbox Code Playgroud)

java multithreading

14
推荐指数
2
解决办法
5836
查看次数

从数组中删除所有零

我有一个数组:

[0, 5, 6, 0, 0, 2, 5]
Run Code Online (Sandbox Code Playgroud)

我想从中删除所有零,以便返回(保持相同的顺序):

[5, 6, 2, 5]
Run Code Online (Sandbox Code Playgroud)

有没有比以下更简单的方法删除所有零?

int[] array = {0, 5, 6, 0, 0, 2, 5};
        int len = 0;
        for (int i=0; i<array.length; i++){
            if (array[i] != 0)
                len++;
        }
        int [] newArray = new int[len];
        for (int i=0, j=0; i<array.length; i++){
            if (array[i] != 0) {
                newArray[j] = array[i];
                j++;
            }
        }
Run Code Online (Sandbox Code Playgroud)

我无法在Arrays课程中找到任何方法,Google/SO搜索也没有给我任何好的答案.

java arrays optimization

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

在C#中使用数学符号显示方程式

我有一个非常简单的应用程序,生成方程式,非常简单的,如

  • 4 + 5 = x
  • x + 4 = 12
  • 15 / x = 3
  • x^2 = 4
  • sqrt(6) = x

当我把它显示给我自己的方程式x + 4 = 12就好了,我可以读得很好但是如果它会x^2 = 4显示为x 2 = 4 会很好.它不一定是图像,它可能是其他任何东西,但它应该这样用户可以理解方程式.

是否有一些图书馆可以帮助我?

c# math

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

(C/C++)为什么将单个阅读器和单个编写器与全局变量同步是有效的?

假设有一个数据结构,如std :: vector和全局变量int syncToken,初始化为零.另外,作为读/写器的两个线程,为什么以下(伪)代码(in)有效?

void reader_thread(){
    while(1){
        if(syncToken!=0){
            while(the_vector.length()>0){
                 // ... process the std::vector 
            }
            syncToken = 0;  // let the writer do it's work
        }
        sleep(1);
    }
}

void writer_thread(){
    while(1){
        std::string data = waitAndReadDataFromSomeResource(the_resource);
        if(syncToken==0){
            the_vector.push(data);
            syncToken = 1;  // would syncToken++; be a difference here?
        }
        // drop data in case we couldn't write to the vector
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这段代码不是(时间)有效的,但据我所知,代码是有效的,因为这两个线程只是以一种不会导致未定义的行为的方式同步全局变量值.在同时使用向量时可能会出现唯一的问题,但这不应该发生,因为只在0和1之间切换作为同步值,对吧?

更新 由于我错误地提出了一个是/否的问题,我更新了我的问题,为什么希望得到一个非常具体的案例作为答案.似乎问题本身根据答案得出了错误的图片,所以我将详细说明我的问题/问题与上面的代码有什么关系.

在此之前,我想指出我要求一个特定的用例/示例/证明/详细解释,它可以准确地说明不同步的内容.即使是一个C示例代码,让一个示例计数器表现为非单调增加,只会回答是/否问题,但不是为什么!我对原因感兴趣.所以,如果你提供一个证明它有问题的例子我对它的原因感兴趣.

通过(我的)定义上面的代码应该被命名为synchronized,当且仅当if语句中的代码(不包括if块底部的syncToken赋值)只能在给定时间由这两个给定线程中的一个执行时.

基于这个想法,我正在寻找一个基于汇编程序的例子,其中两个线程同时执行if块 - 意味着它们不同步或者不同步.

作为参考,让我们看一下gcc生成的汇编程序代码的相关部分:

; just the declaration of an integer global variable …
Run Code Online (Sandbox Code Playgroud)

c++ synchronization

13
推荐指数
3
解决办法
569
查看次数

Visual Studio 任务失败 IntelliCode 自定义完成用户凭据无效

我的公司为我提供了 Visual Studio 2019。它一直在工作(就像这只恐龙可以说在工作一样),并且它一直在右上角显示我的名字缩写,这意味着我在某种程度上“已登录”。

最近开始跟我取笑 Visual Studio 2022,联系 IT 部门讨论怎么办太麻烦了,所以我就直接下载了 Visual Studio 2022,和 2019 一起安装了,一直在工作方式或多或少完全相同。我的名字缩写仍然出现在右上角。

然而,每隔一段时间,它就会向我显示这个弹出窗口:

在此输入图像描述

它说:

任务失败:IntelliCode 自定义完成

您的任务失败并显示以下消息:

Visual Studio 用户凭据无效。

点击此处登录。

它有一个“始终忽略”链接。

如果我“单击此处”(我不知道“这里”是什么意思,所以我单击“此处”一词),弹出窗口就会消失,并且我找不到它的踪迹。因此,为了再次看到它,我必须等到一个随机的时间点,它会自行决定重新出现。除此之外,一切似乎仍然运转良好。我不会被阻止完成任何工作。

我正在使用 ReSharper,所以我很幸运不知道(也不是特别关心)“IntelliCode 自定义完成”是什么,以及它们当前是否正在工作。

有谁知道可能导致这种情况的原因以及我如何才能阻止它?

visual-studio intellicode

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