2014-12-09 1 views
0

코드에서 FileMp3Reader을 열면 Action이라는 단어가 사용 된 다음 람다 식, 메서드를 사용하여 내부에 배치됩니다."액션"키워드는 무엇입니까?

키워드 Action은 무엇인가요? file.Create 방법 내부에서 수행중인 작업은 무엇입니까?

var mp3Path = @"C:\Users\ronnie\Desktop\mp3\dotnetrocks_0717_alan_dahl_imagethink.mp3"; 
int splitLength = 120; 


var mp3Dir = Path.GetDirectoryName(mp3Path); 
var mp3File = Path.GetFileName(mp3Path); 
var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path)); 
Directory.CreateDirectory(splitDir); 

int splitI = 0; 
int secsOffset = 0; 

using (var reader = new Mp3FileReader(mp3Path)) 
{ 
    FileStream writer = null;  
    Action createWriter = new Action(() => { 
     writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3"))); 
    }); 

    Mp3Frame frame; 
    while ((frame = reader.ReadNextFrame()) != null) 
    {   
     if (writer == null) createWriter(); 

     if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength) 
     { 

      writer.Dispose(); 
      createWriter(); 
      secsOffset = (int)reader.CurrentTime.TotalSeconds;    
     } 

     writer.Write(frame.RawData, 0, frame.RawData.Length); 
    } 

    if(writer != null) writer.Dispose(); 
} 
+0

단일 매개 변수를 갖고 값을 반환하지 않는 메서드를 나타내는 해당 형식입니다. – Khan

+1

람다 식과 델리게이트 형식에 대해 배워야합니다. – SLaks

+1

대리인 : http://msdn.microsoft.com/en-us/library/system.action%28v=vs.110%29.aspx – Guffa

답변

1

의견에서 언급했듯이 Action은 위임 유형입니다. 변수 선언문에 배치 된 상황을 고려할 때 아마도 많은 독자가이 문맥에서 추측 할 수 있습니다. :)

File.Create() 메서드의 코드는 splitI 색인을 기반으로 새 파일 이름을 간단히 생성합니다.

역설적으로이 특별한 경우에는 Action의 사용이 불필요합니다. 위임자는 읽기가 더 어려워 지므로이 코드는 실제로 작성되지 않아야합니다. 더 나은 버전은 다음과 같습니다

using (var reader = new Mp3FileReader(mp3Path)) 
{ 
    FileStream writer = null;  

    try 
    { 
     Mp3Frame frame; 
     while ((frame = reader.ReadNextFrame()) != null) 
     {   
      if (writer != null && 
       (int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength) 
      { 
       writer.Dispose(); 
       writer = null; 
       secsOffset = (int)reader.CurrentTime.TotalSeconds;    
      } 

      if (writer == null) 
       writer = File.Create(Path.Combine(splitDir, 
        Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3"))); 

      writer.Write(frame.RawData, 0, frame.RawData.Length); 
     } 
    } 
    finally 
    { 
     if(writer != null) writer.Dispose(); 
    } 
} 

그런 식으로, 작품은 새로운 FileStream 인스턴스가 오직 한 곳에서 필요한 만들 수 있습니다.

실제로 두 곳에서 호출해야 할 필요가 있더라도 IMHO에서는이 특정 시나리오가 대신 명명 된 메소드를 호출합니다. 이 코드는 위임 인스턴스를 사용하는 것보다 더 읽기 쉽습니다.

+0

나는 니가 너와 다른 뭔가를하고 있다고 생각했다. – Servy

+0

이 코드에 대해 많은 질문이 있지만 특히 다음과 같이 나타납니다. 이 코드 줄을 사용하여 출력 할 내용은 무엇입니까? 'Path.ChangeExtension (mp3File, (++ splitI) .ToString ("D4") + ".mp3"))))' – missenna

+0

@missenna : 죄송합니다. 해당 코드 행은 원래 코드에서 그대로 복사됩니다. 그것이 원래 코드에서했던 것처럼 나의 예제에서도 똑같은 일을합니다. –

관련 문제