2011-09-17 3 views
-4

LINQ 쿼리에서 ToList() 메서드를 호출해야하는 이유는 무엇입니까? 예를 들어LINQ 및 클립 보드 보안 관련 문제

:

또한
private void btnEnc_Click(object sender, RoutedEventArgs e) 
{ 
    SHA1 sha = new SHA1Managed(); 
    string sResult = ""; 

    var v = sha.ComputeHash(
     UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text) 
     ).Select(
      p => sResult += string.Format("{0:x2}", p) 
     ).ToList(); 

    Clipboard.SetText(sResult); 

    tbxEncrypted.Text = sResult; 
} 

, 내가 보안 대화 상자를 얻을 클립 보드에 액세스하려고합니다. 이 문제를 어떻게 방지 할 수 있습니까? 기본적으로

SilverLight ClipBoard Access MessageBox

+8

두 가지 완전히 다른 질문입니다. 그들이 두 가지 다른 질문에 게시 된 경우 SO 커뮤니티가 더 도움이 될 것입니다. – AnthonyWJones

답변

4

목록에 호출해야하는 이유는 LINQ 문에서 만든식이 계산 될 때까지 Select 내의식이 계산되지 않기 때문입니다. sResult에 추가하기 위해이 변수를 사용하기 때문에 ToList()를 사용하여 LINQ 표현식을 "실행"하지 않으면 해당 변수가 클립 보드에 놓이기 전에 값이 변경되지 않습니다. ToList()의 출력은 기본적으로 가치가 없다는 점에 유의하십시오.

더 큰 문제는 선택을 잘못 사용하고 있다는 것입니다. Select 절 안에 문자열을 만드는 대신 실제로 string.Join을 사용해야합니다. 코드를 읽고 이해하기가 더 어려워서 Select 절 안에 빌드하면 예기치 않게됩니다. Linq에 관해서는

var sResult = string.Join("", 
       sha.ComputeHash(
         UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text) 
       ).Select(
         p => string.Format("{0:x2}", p) 
       )); 
+0

고마워요. 어떻게 생각하니? 내 관점을 개발할 수있는 책이 있습니까? – uzay95

+1

@ uzay95 - 한 권의 책을 가리킬 수는 없지만 학습과 개선에 집중합니다. Code Complete는 모든 소프트웨어 개발자를위한 아주 좋은 책입니다. 아직 읽지는 않았지만 충분하지 않습니다. Robert McHan, Phil Haack, Scott Guthrie 등 많은 블로그를 읽었습니다. 나는 SO에 관한 질문에 답하는 데 상당한 시간을 할애합니다. 종종 문제의 기술에 대해 더 많이 배우게됩니다. 더 많은 질문에 답하거나 더 많은 것을하기를 원할 수도 있습니다. 답을 알지 못한다고하는 일과 관련된 질문을 찾을 수있을 때까지 연구를 시작하십시오. – tvanfosson

+0

수천 번 감사드립니다 .... – uzay95

5

당신은 부분 신뢰에서 실행. ClipBoard.SetText() (또는 ClipBoard.SetText (...))를 호출 할 때 사용자는 액세스를 확인해야합니다.

브라우저 외부에서 응용 프로그램을 만들고 상승 된 트러스트를 요청하면이 제한이 더 이상 적용되지 않으며 대화 상자가 표시되지 않습니다.

상승 된 신뢰를 요구하도록 응용 프로그램을 구성 할 수 있습니다. 응용 프로그램의 매니페스트에서이 값을 설정해야합니다.

은 자세한 내용은 MSDN에서 살펴 :

http://msdn.microsoft.com/en-us/library/ee721083(v=vs.95).aspx

  1. 프로젝트의 속성을 열고 실버 탭으로 이동합니다.
  2. "브라우저에서 실행중인 응용 프로그램 사용"옵션을 선택하십시오.
  3. Out-Of-Browser 설정 버튼을 클릭하십시오. 새로운 대화 상자가 나타납니다.
  4. "브라우저 외부에서 실행 중 상승 신뢰 필요"옵션을 선택하십시오.

사용자가 Silverlight 응용 프로그램을 설치하면 계속 진행하기 전에 보안 경고가 표시됩니다. 이것은 한 번만 발생합니다. 이 방법으로 응용 프로그램을 실행할 때 ClipBoard.SetText() 호출은 더 이상 보안 대화 상자를 트리거하지 않습니다.

+0

Silverlight가 사용자의 제안에 따라 작업하고 있습니다. 고마워요 ... – uzay95

0

는 :

당신은 당신이 데이터를 imediatly 평가하려면 ToList()를 호출해야합니다.

대부분 Linq 연산자는 설계 상 lazy이며, 좋은 점입니다.