小编syn*_*pis的帖子

为什么我不能从扩展类型的基类调用扩展方法?

我正在尝试List<KeyValuePair<string,int>>通过覆盖索引器来添加查找元素的功能.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class MyList : List<KeyValuePair<string, int>>
    {
        public int this[string key]
        {
            get
            {
                return base.Single(item => item.Key == key).Value;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,编译器抛出此错误:

' System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string,int>>'不包含' Single' 的定义.

虽然List<T>没有那个方法,但它应该是可见的,因为它是来自System.Linq命名空间的扩展方法(包括在内).显然使用this.Single解决问题,但为什么通过base错误访问?

C#规范第7.6.8节说

当base.I发生在类或结构中时,I必须表示该类或结构的基类的成员.

这似乎阻止了对扩展方法的访问base.不过它也说

在绑定时,表单的基本访问表达式base.I和base[E]它们的编写方式完全相同,((B)this).I并且((B)this)[E]在哪里B是构造发生的类或结构的基类.因此,base.I与base[E]对应于 …

c# linq inheritance extension-methods

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

将指针设置为nil以防止Golang中的内存泄漏

我正在学习Go,作为练习,我想实现一个链表.作为参考,我查看了Go官方代码(https://golang.org/src/container/list/list.go).与我相关的一件事是这些线:

   108  // remove removes e from its list, decrements l.len, and returns e.
   109  func (l *List) remove(e *Element) *Element {
   110      e.prev.next = e.next
   111      e.next.prev = e.prev
   112      e.next = nil // avoid memory leaks
   113      e.prev = nil // avoid memory leaks
   114      e.list = nil
   115      l.len--
   116      return e
   117  } 
Run Code Online (Sandbox Code Playgroud)

我很好奇在这种情况下如何设置指向nil的指针可以防止内存泄漏?如果可能的话,我想构建一个有这个缺陷的程序,并在使用pprof进行分析时看到它(我将使用list.go的修改版本,而不使用这个nil指针设置).


为了清楚回答:如果其中一个节点有一个指向它的外部指针,那么所有相邻的被删除节点将通过该指针进行有效引用,并且不会被删除. 在此输入图像描述

  1. 我们创建一个指向Node2的外部指针
  2. 我们从列表中删除节点2-4
  3. 在这一点上,您只能期望节点1,2和5处于活动状态,其余节点将进行GC编辑.但是,由于Node2仍指向Node3等,整个链仍未收集.

garbage-collection memory-leaks memory-management go memory-profiling

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

Logrotate 适用于从不关闭日志文件描述符的进程

我想知道在对从不关闭文件描述符的进程进行 logrotate 时我有什么选择。我知道“重新启动服务”和复制截断选项。但是,假设重新启动进程是不可取的,应用程序不会响应 SIGHUP,并且由于潜在的数据丢失而无法接受复制截断,我不确定还剩下什么选项。

我想到的一个解决方案是在进程即将登录的地方已有一个命名管道。让另一个实用程序从该管道读取(复制到另一个日志文件)并让它对 SIGHUP 信号(来自 logrotate)做出反应。

现在我的问题是,是否已经有一个实用程序可以用于此目的?如果没有,为什么?这种方法有本质上的错误吗?

为了测试这一点,我做了 2 项测试,一项是通过复制截断确认数据丢失,另一项是测试我的“命名管道 + 实用程序”方法:

演示复制截断损失:

应用程序.c

int main(int argc, char *argv[]) {
    FILE* f = fopen("log.txt", "a");
    int cnt = 0;
    for (int i = 0; i < 1000000; i++) {
        for (int j = 0; j < 100; j++) {
                fprintf(f, "Logging line %d\n", cnt);
            cnt++;
        }
        fflush(f);
    }
    fflush(f);
    fclose(f);
    printf("Wrote %d lines\n", cnt);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以及附带的 logrotate 配置:

$cat /etc/logrotate.d/logexp 
/home/synepis/git/logexp/log.txt { …
Run Code Online (Sandbox Code Playgroud)

c linux logging logrotate named-pipes

7
推荐指数
0
解决办法
2199
查看次数

在WPF 3D中旋转360度

我有一个立方体的ModelVisual3D,我想动画它围绕其轴旋转360度.我制作了一个RoationTransform3D,我告诉它旋转360但它根本不旋转,如果你说270度它只旋转90度但反方向旋转.我猜他计算机计算旋转的"最短路径".我想出的最好的解决方案是让一个动画转180,然后在它完成后再调用180以完成完整的旋转.有没有办法在一个动画中做到这一点?

RotateTransform3D rotateTransform = new RotateTransform3D();
myCube.Model.Transform = rotateTransform;

AxisAngleRotation3D rotateAxis =
      new AxisAngleRotation3D(new Vector3D(0, 1, 0), 180/*or 360*/);
Rotation3DAnimation rotateAnimation =
      new Rotation3DAnimation(rotateAxis, TimeSpan.FromSeconds(2));

rotateTransform.BeginAnimation(RotateTransform3D.RotationProperty,
      rotateAnimation);
Run Code Online (Sandbox Code Playgroud)

c# 3d wpf animation rotation

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

在ASP.NET中使用SetAuthCookie()仅存储userId是否安全

我想知道使用FormsAuthentication.SetAuthCookie()在cookie中仅存储UserId(数据库中的主键)并将其保存为持久cookie是否安全?

我已经看到很多人保存用户名的例子,但是这个(userId)可能是一个或两个数字的数字,我想这会让它更容易获得.所以我的问题是我应该这样做吗?如果没有,如果我只是保存用户名,为什么会更好?(这又可能是一个简短的名字)

c# security encryption cookies asp.net-mvc-2

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

如何运行具有时间和内存使用限制的可执行文件?

我想运行可执行文件并限制其内存和时间使用.当然我想知道它是否违反了这些内容,如果不是,我想知道数据使用了多少.我可以从.NET中使用什么来做到这一点?

c#

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

在Chrome扩展程序中打开新标签页

我正在尝试编写一个简单的谷歌扩展程序,点击"ctrl + alt + x"搜索谷歌中的选定文本.

这是我的主要节日:

{
  "name": "A jQuery Chrome extension",
  "version": "0.1",
  "description": "Use jQuery to build Chrome extensions",
  "content_scripts": [
    {
        "matches" : ["http://*/*"],
      "js": ["jquery.js", "jquery.hotkeys.js", "content.js"]
    }
  ],
  "background_page": "background.html",
  "permissions": [
    "tabs"
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是我的内容.js:

$(document).bind('keydown', 'alt+ctrl+x', function() {

    var selectedText = window.getSelection().toString();

    if (selectedText)
    {
        var googleQuery = "http://www.google.com/search?q=" + selectedText;
        alert(googleQuery);
        chrome.tabs.create({"url" : googleQuery});  
        alert(googleQuery);
    }
});
Run Code Online (Sandbox Code Playgroud)

代码一直有效,直到打开新选项卡的行(第一个警报弹出但不弹出第二个).我似乎无法让它工作.我错过了什么?

javascript jquery json google-chrome-extension

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